前提・実現したいこと
Androidで、Javaまたはkotlinで歩数データを取得したいですが、Android10以上だと権限の取得が必要なようです。権限を許可・拒否して歩数センサーの情報を取得したいです。
いろいろサイトを見てみましたが、情報が古いようで、歩数データの権限(ACTIVITY_RECOGNITION)についてあまり詳しく乗っているサイトが見つけられませんでした。
該当のソースコード
MainActivity.java
Java
1package com.example.pedometerjava; 2 3import android.Manifest; 4import android.app.Activity; 5import android.hardware.Sensor; 6import android.hardware.SensorEvent; 7import android.hardware.SensorEventListener; 8import android.hardware.SensorManager; 9import android.os.Build; 10import android.os.Bundle; 11import android.util.Log; 12import android.view.Menu; 13import android.view.MenuItem; 14import android.widget.TextView; 15 16import androidx.core.app.ActivityCompat; 17 18import org.w3c.dom.Text; 19 20 21 22 23public class MainActivity extends Activity implements SensorEventListener{ 24 25 private SensorManager manager; 26 private Sensor delectorSensor; 27 private Sensor stepCntSensor; 28 private int stepcount = 0; 29 private int stepcount2 = 0; 30 31 private TextView textview; 32 private TextView textview2; 33 private final int REQUEST_CODE = 1000; 34 35 @Override 36 protected void onCreate(Bundle savedInstanceState) { 37 super.onCreate(savedInstanceState); 38 setContentView(R.layout.activity_main); 39 40 Log.d("ひらいた","ひらいてるところ"); 41 //SDKが29以上で確認する!!はず!! 42 if(Build.VERSION.SDK_INT >= 29) { 43 String[] permissions = { 44 Manifest.permission.ACTIVITY_RECOGNITION 45 }; 46 checkPermission(permissions, REQUEST_CODE); 47 } 48 49 //センサーマネージャを取得 50 manager = (SensorManager) getSystemService(SENSOR_SERVICE); 51 52 //センサマネージャから TYPE_STEP_DETECTOR についての情報を取得する 53 delectorSensor = manager.getDefaultSensor(Sensor.TYPE_STEP_DETECTOR); 54 55 //センサマネージャから TYPE_STEP_COUNTER についての情報を取得する 56 stepCntSensor = manager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER); 57 58 textview = (TextView)findViewById(R.id.textView); 59 textview2 = (TextView)findViewById(R.id.textView2); 60 61// textview.setText("STEP_DETECTOR="); 62// textview2.setText("STEP_COUNTER="); 63 64 } 65 66 public void checkPermission(String[] permissions, int request_code) { 67 ActivityCompat.requestPermissions(this, permissions, request_code); 68 } 69 70 71 @Override 72 public boolean onOptionsItemSelected(MenuItem item) { 73 // Handle action bar item clicks here. The action bar will 74 // automatically handle clicks on the Home/Up button, so long 75 // as you specify a parent activity in AndroidManifest.xml. 76 int id = item.getItemId(); 77 return super.onOptionsItemSelected(item); 78 } 79 80 @Override 81 public void onAccuracyChanged(Sensor sensor, int accuracy) { 82 // accuracy に変更があった時の処理 83 } 84 85 //センサーからの情報 86 @Override 87 public void onSensorChanged(SensorEvent event) { 88 89 Sensor sensor = event.sensor; 90 float[] values = event.values; 91 long timestamp = event.timestamp; 92 //TYPE_STEP_COUNTER 93 if(sensor.getType() == Sensor.TYPE_STEP_COUNTER){ 94 // 今までの歩数 95 Log.d("今までの歩数", String.valueOf(values[0])); 96 stepcount2++; 97 textview2.setText("STEP_COUNTER=" + stepcount2 + "歩"); 98 } 99 if(sensor.getType() == Sensor.TYPE_STEP_DETECTOR){ 100 // ステップを検知した場合にアクセス 101 Log.d("ステップを検知", String.valueOf(values[0])); 102 stepcount++; 103 textview.setText("STEP_DETECTOR=" + stepcount + "歩"); 104 105 } 106 } 107 108 @Override 109 protected void onResume() { 110 super.onResume(); 111 112 // リスナー設定 113 manager.registerListener (this, 114 stepCntSensor, 115 SensorManager.SENSOR_DELAY_NORMAL); 116 117 manager.registerListener(this, 118 delectorSensor, 119 SensorManager.SENSOR_DELAY_NORMAL); 120 } 121 122 @Override 123 protected void onPause() { 124 super.onPause(); 125 126 // リスナー解除 127 manager.unregisterListener(this,stepCntSensor); 128 manager.unregisterListener(this,delectorSensor); 129 } 130}
↓manifestに追加
<uses-permission android:name="com.google.android.gms.permission.ACTIVITY_RECOGNITION" />
デザイナーにはTextViewが2つ並んでいるのみです。
エラー?
D/SensorManager: registerListener fail (1) :: 1, step_counter Non-wakeup, 200000, 0,
D/SensorManager: registerListener fail (1) :: 13, step_detector Non-wakeup, 200000, 0,
補足情報(FW/ツールのバージョンなど)
実機はGalaxyS9を使用しました。
あなたの回答
tips
プレビュー