質問編集履歴

4 発生している問題・エラーメッセージ

退会済みユーザー

退会済みユーザー

2018/01/16 14:11  投稿

Android Studio タイムカウントと加速度センサ値取得の組み合わせについて
###前提・実現したいこと
Androidで加速度センサ値を定期的にテキストファイルに書き込むプログラムを作成しています。
・システムの流れ
 まずアプリを起動すると、加速度センサ値(x, y, z)、タイマー(00:00.0)、startbutton、stopbutton が表示されます。
 加速度センサ値はタイマーをカウントしていなくても、更新されるたびに表示します。
 タイマーの値は初期化されていて、startbuttonを押すと0.1秒刻みでカウントします。
 stopbuttonを押すとタイマーのカウントが止まり、タイムが初期化されます。
 タイムをカウントしている間に、その時の加速度センサ値を0.1秒刻みでテキストファイルに書き込みます。
###発生している問題・エラーメッセージ
現在確認できているプログラムの異常はこれだけで、デバックは正常に通りますし、エラー及び警告メッセージも出ません。
Activity.classで"source code does not match the bytecode"とエラーが表示されました.
Method.classの public native Object invoke(Object var1, Object... var2) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException;と書かれた行にも同じように"source code does not match the bytecode"とエラーが表示されました.
###該当のソースコード
```ここに言語を入力
【MainActivity.java】
 
 
package com.example.oga_180114;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import java.text.SimpleDateFormat;
import java.util.Locale;
import java.util.Timer;
import java.util.TimerTask;
import android.os.Handler;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Environment;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.widget.EditText;
import android.widget.Toast;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
public class MainActivity extends AppCompatActivity implements SensorEventListener {
   private final int REQUEST_PERMISSION = 1000;
   float sensorX, sensorY, sensorZ;
   private EditText editText;
   private String fileName = "testfile.txt";
   private SensorManager sensorManager;
   private TextView textView, textInfo;
   private Timer timer;
   private Handler handler = new Handler();
   private TextView timerText;
   private long delay, period;
   private int count;
   private SimpleDateFormat dataFormat =
           new SimpleDateFormat("mm:ss.S", Locale.US);
   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
       // Android 6, API 23以上でパーミッシンの確認
       if (Build.VERSION.SDK_INT >= 23) {
           checkPermission();
       } else {
           setUpReadWriteExternalStorage();
       }
       // Get an instance of the SensorManager
       sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
       // Get an instance of the TextView
       textView = findViewById(R.id.text_view);
       delay = 0;
       period = 100;
       Button startButton = findViewById(R.id.start_button);
       Button stopButton = findViewById(R.id.stop_button);
       timerText = findViewById(R.id.timer);
       timerText.setText(dataFormat.format(0));
   }
   private void setUpReadWriteExternalStorage() {
       textView = findViewById(R.id.text_view);
       Button startButton = findViewById(R.id.start_button);
       startButton.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View v) {
               if (null != timer) {
                   timer.cancel();
                   timer = null;
               }
               // Timer インスタンスを生成
               timer = new Timer();
               // カウンター
               count = 0;
               timerText.setText(dataFormat.format(0));
               // 現在ストレージが書き込みできるかチェック
               // 書き込みできるかチェック
               if (isExternalStorageWritable()) {
                   //String text;
                   String str = editText.getText().toString();
                   String filePath =
                           Environment.getExternalStorageDirectory().getPath()
                                   + "/" + fileName;
 
                   File file = new File(filePath);
                   try (FileOutputStream fileOutputStream =
                                new FileOutputStream(file, true);
                        OutputStreamWriter outputStreamWriter =
                                new OutputStreamWriter(fileOutputStream, "UTF-8");
                        BufferedWriter bw =
                                new BufferedWriter(outputStreamWriter);
                   ) {
                       bw.write(sensorX + " " + sensorY + " " + sensorZ + "\n");
                       bw.flush();
                       //text = "saved";
                   } catch (Exception e) {
                       //text = "error: FileOutputStream";
                       e.printStackTrace();
                   }
                   //textView.setText(text);
                   timer.scheduleAtFixedRate(new TimerTask() {
                       @Override
                       public void run() {
                           // handlerdを使って処理をキューイングする
                           // 処理をキューイング
                           handler.post(new Runnable() {
                               public void run() {
                                   count++;
                                   timerText.setText(dataFormat.
                                           format(count * period));
                               }
                           });
                       }
                   }, delay, period);
               }
           }
       });
       Button stopButton = findViewById(R.id.stop_button);
       stopButton.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View v) {
               // timer がnullでない、起動しているときのみcancleする
               if (null != timer) {
                   // Cancel
                   timer.cancel();
                   timer = null;
                   timerText.setText(dataFormat.format(0));
               }
           }
           ;
       });
   }
   // Checks if external storage is available for read and write
   public boolean isExternalStorageWritable() {
       String state = Environment.getExternalStorageState();
       return Environment.MEDIA_MOUNTED.equals(state);
   }
   // Checks if external storage is available to at least read
   public boolean isExternalStorageReadable() {
       String state = Environment.getExternalStorageState();
       return (Environment.MEDIA_MOUNTED.equals(state) ||
               Environment.MEDIA_MOUNTED_READ_ONLY.equals(state));
   }
   // permissionの確認
   public void checkPermission() {
       // 既に許可している
       // 既に許可
       if (ActivityCompat.checkSelfPermission(this,
               Manifest.permission.WRITE_EXTERNAL_STORAGE) ==
               PackageManager.PERMISSION_GRANTED){
           setUpReadWriteExternalStorage();
       }
       // 拒否していた場合
       // 拒否
       else{
           requestLocationPermission();
       }
   }
   // 許可を求める
   private void requestLocationPermission() {
       if (ActivityCompat.shouldShowRequestPermissionRationale(this,
               Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
           ActivityCompat.requestPermissions(MainActivity.this,
                   new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_PERMISSION);
       } else {
           Toast toast =
                   Toast.makeText(this, "アプリ実行に許可が必要です", Toast.LENGTH_SHORT);
                   Toast.makeText(this, "許可が必要", Toast.LENGTH_SHORT);
           toast.show();
 
           ActivityCompat.requestPermissions(this,
                   new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,},
                   REQUEST_PERMISSION);
 
       }
   }
   // 結果の受け取り
   @Override
   public void onRequestPermissionsResult(
           int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
       if (requestCode == REQUEST_PERMISSION) {
           // 使用が許可された
           if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
               setUpReadWriteExternalStorage();
           } else {
               Toast toast =
                       Toast.makeText(this, "何もできません", Toast.LENGTH_SHORT);
               toast.show();
           }
       }
   }
   @Override
   protected void onResume() {
       super.onResume();
       // Listenerの登録
       Sensor accel = sensorManager.getDefaultSensor(
               Sensor.TYPE_LINEAR_ACCELERATION);
 
       sensorManager.registerListener(this, accel, SensorManager.SENSOR_DELAY_NORMAL);
       //sensorManager.registerListener(this, accel, SensorManager.SENSOR_DELAY_FASTEST);  
       //sensorManager.registerListener(this, accel, SensorManager.SENSOR_DELAY_GAME);  
       //sensorManager.registerListener(this, accel, SensorManager.SENSOR_DELAY_UI);  
   }
   @Override
   protected void onPause() {
       super.onPause();
       // Listenerを解除
       sensorManager.unregisterListener(this);
   }
   @Override
   public void onSensorChanged(SensorEvent event) {
       if (event.sensor.getType() == Sensor.TYPE_LINEAR_ACCELERATION) {
           sensorX = event.values[0];
           sensorY = event.values[1];
           sensorZ = event.values[2];
           String strTmp = "加速度センサー\n"
                   + " X: " + sensorX + "\n"
                   + " Y: " + sensorY + "\n"
                   + " Z: " + sensorZ;
           textView.setText(strTmp);
       }
   }
   @Override
   public void onAccuracyChanged(Sensor sensor, int accuracy) {
   }
   }
}
```
###試したこと
startbuttonを押すとアプリが落ちるので、その原因はプログラムに記述されている
「private void setUpReadWriteExternalStorage()」->「startButton.setOnClickListener(new View.OnClickListener()」内に
問題があると考えています。
しかし、具体的に何が原因となっていて、どのように修正したらよいのか分からない状況です。  
###補足情報(言語/FW/ツール等のバージョンなど)
開発環境:Android Studio 3.0.1 for Windows
開発言語:Java
Android Studioでの開発は1ヵ月くらいで、まだ仕組みを理解していないことも多い未熟者です。
どうかご指摘、ご指導よろしくお願いします。
  • Android Studio

    4887 questions

    Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

3 ソースコードを ```で挟んだ

退会済みユーザー

退会済みユーザー

2018/01/15 15:01  投稿

Android Studio タイムカウントと加速度センサ値取得の組み合わせについて
###前提・実現したいこと
 
Androidで加速度センサ値を定期的にテキストファイルに書き込むプログラムを作成しています。
・システムの流れ
 まずアプリを起動すると、加速度センサ値(x, y, z)、タイマー(00:00.0)、startbutton、stopbutton が表示されます。
 加速度センサ値はタイマーをカウントしていなくても、更新されるたびに表示します。
 タイマーの値は初期化されていて、startbuttonを押すと0.1秒刻みでカウントします。
 stopbuttonを押すとタイマーのカウントが止まり、タイムが初期化されます。
 タイムをカウントしている間に、その時の加速度センサ値を0.1秒刻みでテキストファイルに書き込みます。
###発生している問題・エラーメッセージ
このような仕組みでプログラムを作成してみたのですが、アプリを起動してstartbuttonを押すと強制終了してしまいます。
現在確認できているプログラムの異常はこれだけで、デバックは正常に通りますし、エラー及び警告メッセージも出ません。
###該当のソースコード
 
```ここに言語を入力  
【MainActivity.java】
package com.example.oga_180114;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import java.text.SimpleDateFormat;
import java.util.Locale;
import java.util.Timer;
import java.util.TimerTask;
import android.os.Handler;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Environment;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.widget.EditText;
import android.widget.Toast;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
public class MainActivity extends AppCompatActivity implements SensorEventListener {
   private final int REQUEST_PERMISSION = 1000;
   float sensorX, sensorY, sensorZ;
   private EditText editText;
   private String fileName = "testfile.txt";
   private SensorManager sensorManager;
   private TextView textView, textInfo;
   private Timer timer;
   private Handler handler = new Handler();
   private TextView timerText;
   private long delay, period;
   private int count;
   private SimpleDateFormat dataFormat =
           new SimpleDateFormat("mm:ss.S", Locale.US);
   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
       // Android 6, API 23以上でパーミッシンの確認
       if (Build.VERSION.SDK_INT >= 23) {
           checkPermission();
       } else {
           setUpReadWriteExternalStorage();
       }
       // Get an instance of the SensorManager
       sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
       // Get an instance of the TextView
       textView = findViewById(R.id.text_view);
       delay = 0;
       period = 100;
       Button startButton = findViewById(R.id.start_button);
       Button stopButton = findViewById(R.id.stop_button);
       timerText = findViewById(R.id.timer);
       timerText.setText(dataFormat.format(0));
   }
   private void setUpReadWriteExternalStorage() {
       textView = findViewById(R.id.text_view);
       Button startButton = findViewById(R.id.start_button);
       startButton.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View v) {
               if (null != timer) {
                   timer.cancel();
                   timer = null;
               }
               // Timer インスタンスを生成
               timer = new Timer();
               // カウンター
               count = 0;
               timerText.setText(dataFormat.format(0));
               // 現在ストレージが書き込みできるかチェック
               if (isExternalStorageWritable()) {
                   //String text;
                   String str = editText.getText().toString();
                   String filePath =
                           Environment.getExternalStorageDirectory().getPath()
                                   + "/" + fileName;
                   File file = new File(filePath);
                   try (FileOutputStream fileOutputStream =
                                new FileOutputStream(file, true);
                        OutputStreamWriter outputStreamWriter =
                                new OutputStreamWriter(fileOutputStream, "UTF-8");
                        BufferedWriter bw =
                                new BufferedWriter(outputStreamWriter);
                   ) {
                       bw.write(sensorX + " " + sensorY + " " + sensorZ + "\n");
                       bw.flush();
                       //text = "saved";
                   } catch (Exception e) {
                       //text = "error: FileOutputStream";
                       e.printStackTrace();
                   }
                   //textView.setText(text);
                   timer.scheduleAtFixedRate(new TimerTask() {
                       @Override
                       public void run() {
                           // handlerdを使って処理をキューイングする
                           handler.post(new Runnable() {
                               public void run() {
                                   count++;
                                   timerText.setText(dataFormat.
                                           format(count * period));
                               }
                           });
                       }
                   }, delay, period);
               }
           }
       });
       Button stopButton = findViewById(R.id.stop_button);
       stopButton.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View v) {
               // timer がnullでない、起動しているときのみcancleする
               if (null != timer) {
                   // Cancel
                   timer.cancel();
                   timer = null;
                   timerText.setText(dataFormat.format(0));
               }
           }
           ;
       });
   }
   // Checks if external storage is available for read and write
   public boolean isExternalStorageWritable() {
       String state = Environment.getExternalStorageState();
       return Environment.MEDIA_MOUNTED.equals(state);
   }
   // Checks if external storage is available to at least read
   public boolean isExternalStorageReadable() {
       String state = Environment.getExternalStorageState();
       return (Environment.MEDIA_MOUNTED.equals(state) ||
               Environment.MEDIA_MOUNTED_READ_ONLY.equals(state));
   }
   // permissionの確認
   public void checkPermission() {
       // 既に許可している
       if (ActivityCompat.checkSelfPermission(this,
               Manifest.permission.WRITE_EXTERNAL_STORAGE) ==
               PackageManager.PERMISSION_GRANTED){
           setUpReadWriteExternalStorage();
       }
       // 拒否していた場合
       else{
           requestLocationPermission();
       }
   }
   // 許可を求める
   private void requestLocationPermission() {
       if (ActivityCompat.shouldShowRequestPermissionRationale(this,
               Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
           ActivityCompat.requestPermissions(MainActivity.this,
                   new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_PERMISSION);
       } else {
           Toast toast =
                   Toast.makeText(this, "アプリ実行に許可が必要です", Toast.LENGTH_SHORT);
           toast.show();
           ActivityCompat.requestPermissions(this,
                   new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,},
                   REQUEST_PERMISSION);
       }
   }
   // 結果の受け取り
   @Override
   public void onRequestPermissionsResult(
           int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
       if (requestCode == REQUEST_PERMISSION) {
           // 使用が許可された
           if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
               setUpReadWriteExternalStorage();
           } else {
               // それでも拒否された時の対応
               Toast toast =
                       Toast.makeText(this, "何もできません", Toast.LENGTH_SHORT);
               toast.show();
           }
       }
   }
   @Override
   protected void onResume() {
       super.onResume();
       // Listenerの登録
       Sensor accel = sensorManager.getDefaultSensor(
               Sensor.TYPE_LINEAR_ACCELERATION);
       sensorManager.registerListener(this, accel, SensorManager.SENSOR_DELAY_NORMAL);
       //sensorManager.registerListener(this, accel, SensorManager.SENSOR_DELAY_FASTEST);
       //sensorManager.registerListener(this, accel, SensorManager.SENSOR_DELAY_GAME);
       //sensorManager.registerListener(this, accel, SensorManager.SENSOR_DELAY_UI);
   }
   @Override
   protected void onPause() {
       super.onPause();
       // Listenerを解除
       sensorManager.unregisterListener(this);
   }
   @Override
   public void onSensorChanged(SensorEvent event) {
       if (event.sensor.getType() == Sensor.TYPE_LINEAR_ACCELERATION) {
           sensorX = event.values[0];
           sensorY = event.values[1];
           sensorZ = event.values[2];
           String strTmp = "加速度センサー\n"
                   + " X: " + sensorX + "\n"
                   + " Y: " + sensorY + "\n"
                   + " Z: " + sensorZ;
           textView.setText(strTmp);
       }
   }
   @Override
   public void onAccuracyChanged(Sensor sensor, int accuracy) {
   }
}
```  
 
###試したこと
startbuttonを押すとアプリが落ちるので、その原因はプログラムに記述されている
「private void setUpReadWriteExternalStorage()」->「startButton.setOnClickListener(new View.OnClickListener()」内に
問題があると考えています。
しかし、具体的に何が原因となっていて、どのように修正したらよいのか分からない状況です。
###補足情報(言語/FW/ツール等のバージョンなど)
開発環境:Android Studio 3.0.1 for Windows
開発言語:Java
Android Studioでの開発は1ヵ月くらいで、まだ仕組みを理解していないことも多い未熟者です。
どうかご指摘、ご指導よろしくお願いします。
  • Android Studio

    4887 questions

    Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

2 誤字修正

退会済みユーザー

退会済みユーザー

2018/01/14 23:48  投稿

Android Studio タイムカウントと加速度センサ値取得の組み合わせについて
###前提・実現したいこと
Androidで加速度センサ値を定期的にテキストファイルに書き込むプログラムを作成しています。
・システムの流れ
 まずアプリを起動すると、加速度センサ値(x, y, z)、タイマー(00:00.0)、startbutton、stopbutton が表示されます。
 加速度センサ値はタイマーをカウントしていなくても、更新されるたびに表示します。
 タイマーの値は初期化されていて、startbuttonを押すと0.1秒刻みでカウントします。
 stopbuttonを押すとタイマーのカウントが止まり、タイムが初期化されます。
 タイムをカウントしている間に、その時の加速度センサ値を0.1秒刻みでテキストファイルに書き込みます。
###発生している問題・エラーメッセージ
このような仕組みでプログラムを作成してみたのですが、アプリを起動してstartbuttonを押すと強制終了してしまいます。
現在確認できているプログラムの異常はこれだけで、デバックは正常に通りますし、エラー及び警告メッセージも出ません。
###該当のソースコード
【MainActivity.java】
package com.example.ogahara.sotuken180114;
package com.example.oga_180114;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import java.text.SimpleDateFormat;
import java.util.Locale;
import java.util.Timer;
import java.util.TimerTask;
import android.os.Handler;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Environment;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.widget.EditText;
import android.widget.Toast;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
public class MainActivity extends AppCompatActivity implements SensorEventListener {
   private final int REQUEST_PERMISSION = 1000;
   float sensorX, sensorY, sensorZ;
   private EditText editText;
   private String fileName = "testfile.txt";
   private SensorManager sensorManager;
   private TextView textView, textInfo;
   private Timer timer;
   private Handler handler = new Handler();
   private TextView timerText;
   private long delay, period;
   private int count;
   private SimpleDateFormat dataFormat =
           new SimpleDateFormat("mm:ss.S", Locale.US);
   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
       // Android 6, API 23以上でパーミッシンの確認
       if (Build.VERSION.SDK_INT >= 23) {
           checkPermission();
       } else {
           setUpReadWriteExternalStorage();
       }
       // Get an instance of the SensorManager
       sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
       // Get an instance of the TextView
       textView = findViewById(R.id.text_view);
       delay = 0;
       period = 100;
       Button startButton = findViewById(R.id.start_button);
       Button stopButton = findViewById(R.id.stop_button);
       timerText = findViewById(R.id.timer);
       timerText.setText(dataFormat.format(0));
   }
   private void setUpReadWriteExternalStorage() {
       textView = findViewById(R.id.text_view);
       Button startButton = findViewById(R.id.start_button);
       startButton.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View v) {
               if (null != timer) {
                   timer.cancel();
                   timer = null;
               }
               // Timer インスタンスを生成
               timer = new Timer();
               // カウンター
               count = 0;
               timerText.setText(dataFormat.format(0));
               // 現在ストレージが書き込みできるかチェック
               if (isExternalStorageWritable()) {
                   //String text;
                   String str = editText.getText().toString();
                   String filePath =
                           Environment.getExternalStorageDirectory().getPath()
                                   + "/" + fileName;
                   File file = new File(filePath);
                   try (FileOutputStream fileOutputStream =
                                new FileOutputStream(file, true);
                        OutputStreamWriter outputStreamWriter =
                                new OutputStreamWriter(fileOutputStream, "UTF-8");
                        BufferedWriter bw =
                                new BufferedWriter(outputStreamWriter);
                   ) {
                       bw.write(sensorX + " " + sensorY + " " + sensorZ + "\n");
                       bw.flush();
                       //text = "saved";
                   } catch (Exception e) {
                       //text = "error: FileOutputStream";
                       e.printStackTrace();
                   }
                   //textView.setText(text);
                   timer.scheduleAtFixedRate(new TimerTask() {
                       @Override
                       public void run() {
                           // handlerdを使って処理をキューイングする
                           handler.post(new Runnable() {
                               public void run() {
                                   count++;
                                   timerText.setText(dataFormat.
                                           format(count * period));
                               }
                           });
                       }
                   }, delay, period);
               }
           }
       });
       Button stopButton = findViewById(R.id.stop_button);
       stopButton.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View v) {
               // timer がnullでない、起動しているときのみcancleする
               if (null != timer) {
                   // Cancel
                   timer.cancel();
                   timer = null;
                   timerText.setText(dataFormat.format(0));
               }
           }
           ;
       });
   }
   // Checks if external storage is available for read and write
   public boolean isExternalStorageWritable() {
       String state = Environment.getExternalStorageState();
       return Environment.MEDIA_MOUNTED.equals(state);
   }
   // Checks if external storage is available to at least read
   public boolean isExternalStorageReadable() {
       String state = Environment.getExternalStorageState();
       return (Environment.MEDIA_MOUNTED.equals(state) ||
               Environment.MEDIA_MOUNTED_READ_ONLY.equals(state));
   }
   // permissionの確認
   public void checkPermission() {
       // 既に許可している
       if (ActivityCompat.checkSelfPermission(this,
               Manifest.permission.WRITE_EXTERNAL_STORAGE) ==
               PackageManager.PERMISSION_GRANTED){
           setUpReadWriteExternalStorage();
       }
       // 拒否していた場合
       else{
           requestLocationPermission();
       }
   }
   // 許可を求める
   private void requestLocationPermission() {
       if (ActivityCompat.shouldShowRequestPermissionRationale(this,
               Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
           ActivityCompat.requestPermissions(MainActivity.this,
                   new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_PERMISSION);
       } else {
           Toast toast =
                   Toast.makeText(this, "アプリ実行に許可が必要です", Toast.LENGTH_SHORT);
           toast.show();
           ActivityCompat.requestPermissions(this,
                   new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,},
                   REQUEST_PERMISSION);
       }
   }
   // 結果の受け取り
   @Override
   public void onRequestPermissionsResult(
           int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
       if (requestCode == REQUEST_PERMISSION) {
           // 使用が許可された
           if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
               setUpReadWriteExternalStorage();
           } else {
               // それでも拒否された時の対応
               Toast toast =
                       Toast.makeText(this, "何もできません", Toast.LENGTH_SHORT);
               toast.show();
           }
       }
   }
   @Override
   protected void onResume() {
       super.onResume();
       // Listenerの登録
       Sensor accel = sensorManager.getDefaultSensor(
               Sensor.TYPE_LINEAR_ACCELERATION);
       sensorManager.registerListener(this, accel, SensorManager.SENSOR_DELAY_NORMAL);
       //sensorManager.registerListener(this, accel, SensorManager.SENSOR_DELAY_FASTEST);
       //sensorManager.registerListener(this, accel, SensorManager.SENSOR_DELAY_GAME);
       //sensorManager.registerListener(this, accel, SensorManager.SENSOR_DELAY_UI);
   }
   @Override
   protected void onPause() {
       super.onPause();
       // Listenerを解除
       sensorManager.unregisterListener(this);
   }
   @Override
   public void onSensorChanged(SensorEvent event) {
       if (event.sensor.getType() == Sensor.TYPE_LINEAR_ACCELERATION) {
           sensorX = event.values[0];
           sensorY = event.values[1];
           sensorZ = event.values[2];
           String strTmp = "加速度センサー\n"
                   + " X: " + sensorX + "\n"
                   + " Y: " + sensorY + "\n"
                   + " Z: " + sensorZ;
           textView.setText(strTmp);
       }
   }
   @Override
   public void onAccuracyChanged(Sensor sensor, int accuracy) {
   }
}
###試したこと
startbuttonを押すとアプリが落ちるので、その原因はプログラムに記述されている
「private void setUpReadWriteExternalStorage()」->「startButton.setOnClickListener(new View.OnClickListener()」内に
問題があると考えています。
しかし、具体的に何が原因となっていて、どのように修正したらよいのか分からない状況です。
###補足情報(言語/FW/ツール等のバージョンなど)
開発環境:Android Studio 3.0.1 for Windows
開発言語:Java
Android Studioでの開発は1ヵ月くらいで、まだ仕組みを理解していないことも多い未熟者です。
どうかご指摘、ご指導よろしくお願いします。
  • Android Studio

    4887 questions

    Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

1 誤字

退会済みユーザー

退会済みユーザー

2018/01/14 23:45  投稿

Android Studio タイムカウントと加速度センサ値取得の組み合わせについて
###前提・実現したいこと
Androidで加速度センサ値を定期的にテキストファイルに書き込むプログラムを作成しています。
・システムの流れ
 まずアプリを起動すると、加速度センサ値(x, y, z)、タイマー(00:00.0)、startbutton、stopbutton が表示されます。
 加速度センサ値はタイマーをカウントしていなくても、更新されるたびに表示します。
 タイマーの値は初期化されていて、startbuttonを押すと0.1秒刻みでカウントします。
 stopbuttonを押すとタイマーのカウントが止まり、タイムが初期化されます。
 タイムをカウントしている間に、その時の加速度センサ値を0.1秒刻みでテキストファイルに書き込みます。
###発生している問題・エラーメッセージ
このような仕組みでプログラムを作成してみたのですが、アプリを起動してstartbuttonを押すと強制終了してしまいます。
現在確認できているプログラムの異常はこれだけで、デバックは正常に通りますし、エラー及び警告メッセージも出ません。
###該当のソースコード
【MainActivity.java】
package com.example.ogahara.sotuken180114;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import java.text.SimpleDateFormat;
import java.util.Locale;
import java.util.Timer;
import java.util.TimerTask;
import android.os.Handler;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Environment;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.widget.EditText;
import android.widget.Toast;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
public class MainActivity extends AppCompatActivity implements SensorEventListener {
private final int REQUEST_PERMISSION = 1000;
float sensorX, sensorY, sensorZ;
private EditText editText;
private String fileName = "testfile.txt";
private SensorManager sensorManager;
private TextView textView, textInfo;
private Timer timer;
private Handler handler = new Handler();
private TextView timerText;
private long delay, period;
private int count;
private SimpleDateFormat dataFormat =
new SimpleDateFormat("mm:ss.S", Locale.US);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Android 6, API 23以上でパーミッシンの確認
if (Build.VERSION.SDK_INT >= 23) {
checkPermission();
} else {
setUpReadWriteExternalStorage();
}
// Get an instance of the SensorManager
sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
// Get an instance of the TextView
textView = findViewById(R.id.text_view);
delay = 0;
period = 100;
Button startButton = findViewById(R.id.start_button);
Button stopButton = findViewById(R.id.stop_button);
timerText = findViewById(R.id.timer);
timerText.setText(dataFormat.format(0));
}
private void setUpReadWriteExternalStorage() {
textView = findViewById(R.id.text_view);
Button startButton = findViewById(R.id.start_button);
startButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (null != timer) {
timer.cancel();
timer = null;
}
// Timer インスタンスを生成
timer = new Timer();
// カウンター
count = 0;
timerText.setText(dataFormat.format(0));
// 現在ストレージが書き込みできるかチェック
if (isExternalStorageWritable()) {
//String text;
String str = editText.getText().toString();
String filePath =
Environment.getExternalStorageDirectory().getPath()
+ "/" + fileName;
File file = new File(filePath);
try (FileOutputStream fileOutputStream =
new FileOutputStream(file, true);
OutputStreamWriter outputStreamWriter =
new OutputStreamWriter(fileOutputStream, "UTF-8");
BufferedWriter bw =
new BufferedWriter(outputStreamWriter);
) {
bw.write(sensorX + " " + sensorY + " " + sensorZ + "\n");
bw.flush();
//text = "saved";
} catch (Exception e) {
//text = "error: FileOutputStream";
e.printStackTrace();
}
//textView.setText(text);
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
// handlerdを使って処理をキューイングする
handler.post(new Runnable() {
public void run() {
count++;
timerText.setText(dataFormat.
format(count * period));
}
});
}
}, delay, period);
}
}
});
Button stopButton = findViewById(R.id.stop_button);
stopButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// timer がnullでない、起動しているときのみcancleする
if (null != timer) {
// Cancel
timer.cancel();
timer = null;
timerText.setText(dataFormat.format(0));
}
}
;
});
}
// Checks if external storage is available for read and write
public boolean isExternalStorageWritable() {
String state = Environment.getExternalStorageState();
return Environment.MEDIA_MOUNTED.equals(state);
}
// Checks if external storage is available to at least read
public boolean isExternalStorageReadable() {
String state = Environment.getExternalStorageState();
return (Environment.MEDIA_MOUNTED.equals(state) ||
Environment.MEDIA_MOUNTED_READ_ONLY.equals(state));
}
// permissionの確認
public void checkPermission() {
// 既に許可している
if (ActivityCompat.checkSelfPermission(this,
Manifest.permission.WRITE_EXTERNAL_STORAGE) ==
PackageManager.PERMISSION_GRANTED){
setUpReadWriteExternalStorage();
}
// 拒否していた場合
else{
requestLocationPermission();
}
}
// 許可を求める
private void requestLocationPermission() {
if (ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_PERMISSION);
} else {
Toast toast =
Toast.makeText(this, "アプリ実行に許可が必要です", Toast.LENGTH_SHORT);
toast.show();
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,},
REQUEST_PERMISSION);
}
}
// 結果の受け取り
@Override
public void onRequestPermissionsResult(
int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == REQUEST_PERMISSION) {
// 使用が許可された
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
setUpReadWriteExternalStorage();
} else {
// それでも拒否された時の対応
Toast toast =
Toast.makeText(this, "何もできません", Toast.LENGTH_SHORT);
toast.show();
}
}
}
@Override
protected void onResume() {
super.onResume();
// Listenerの登録
Sensor accel = sensorManager.getDefaultSensor(
Sensor.TYPE_LINEAR_ACCELERATION);
sensorManager.registerListener(this, accel, SensorManager.SENSOR_DELAY_NORMAL);
//sensorManager.registerListener(this, accel, SensorManager.SENSOR_DELAY_FASTEST);
//sensorManager.registerListener(this, accel, SensorManager.SENSOR_DELAY_GAME);
//sensorManager.registerListener(this, accel, SensorManager.SENSOR_DELAY_UI);
}
@Override
protected void onPause() {
super.onPause();
// Listenerを解除
sensorManager.unregisterListener(this);
}
@Override
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_LINEAR_ACCELERATION) {
sensorX = event.values[0];
sensorY = event.values[1];
sensorZ = event.values[2];
String strTmp = "加速度センサー\n"
+ " X: " + sensorX + "\n"
+ " Y: " + sensorY + "\n"
+ " Z: " + sensorZ;
textView.setText(strTmp);
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
}
###試したこと
startbuttonを押すとアプリが落ちるので、その原因はプログラムに記述されている
「private void setUpReadWriteExternalStorage()」->「startButton.setOnClickListener(new View.OnClickListener()」内に
問題があると考えています。
しかし、具体的に何が原因となっていて、どのように修正したらよいのか分からない状況です。
###補足情報(言語/FW/ツール等のバージョンなど)
開発環境:Android Studio 3.0.1 for Windows
開発言語:Java
Android Studioでの開発は1ヵ月くらいで、まだ仕組みを理解していないことも多い未熟者です。
どうかご指摘、ご指導よろしくお願いします。
  • Android Studio

    4887 questions

    Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る