質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Android Studio

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

Q&A

1回答

1622閲覧

Android Studio タイムカウントと加速度センサ値取得の組み合わせについて

退会済みユーザー

退会済みユーザー

総合スコア0

Android Studio

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

0グッド

1クリップ

投稿2018/01/14 14:43

編集2022/01/12 10:55

###前提・実現したいこと
Androidで加速度センサ値を定期的にテキストファイルに書き込むプログラムを作成しています。
・システムの流れ
まずアプリを起動すると、加速度センサ値(x, y, z)、タイマー(00:00.0)、startbutton、stopbutton が表示されます。
加速度センサ値はタイマーをカウントしていなくても、更新されるたびに表示します。
タイマーの値は初期化されていて、startbuttonを押すと0.1秒刻みでカウントします。
stopbuttonを押すとタイマーのカウントが止まり、タイムが初期化されます。
タイムをカウントしている間に、その時の加速度センサ値を0.1秒刻みでテキストファイルに書き込みます。

###発生している問題・エラーメッセージ
アプリを起動してstartbuttonを押すと強制終了してしまいます。
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() { // 処理をキューイング 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); } @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ヵ月くらいで、まだ仕組みを理解していないことも多い未熟者です。
どうかご指摘、ご指導よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aja

2018/01/15 00:59

コードは ```で挟んで記述してもらった方が見やすいです。質問フォーマットを確認してください
退会済みユーザー

退会済みユーザー

2018/01/15 08:09

指摘ありがとうございます. プログラムのソースコードを囲んでみました.
guest

回答1

0

エラーログが必ずでているはずです。
それを見るのが一番手っ取り早いのです。
しかし、本当に無いというのであれば下記の方法で確認してください。
1-onClickの先頭にブレークポイントを設置する。
2-デバッグ実行をする。
3-ブレークポイントで停止させる。
4-ステップ実行でどこで終了するかを確認する。

投稿2018/01/15 03:37

yona

総合スコア18155

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/01/15 13:25

コメントありがとうございます. ブレークポイントでプログラムをデバッグし確認してみたら,'performCreate:6102, Activity (android.app)'で「source code does not match the bytecode」とエラーが表示されました. まだどのようなエラーなのかわかっていませんが,後にz軸の加速度センサ値が格納されるx2という変数に値が入っていなかったので,問題であることは間違いないです.
yona

2018/01/15 14:38

どの行でエラーになったかを教えてください。
退会済みユーザー

退会済みユーザー

2018/01/15 16:50

まず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"とエラーが表示されました.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問