よくあるエラー文
java.lang.SecurityException: Requires READ_PHONE_STATE: Neither user 10030 nor current process has android.permission.READ_PHONE_STATE
java.lang.RuntimeException: Unable to start activity ComponentInfo{パッケージ名/パッケージ名.起動クラス名}: java.lang.SecurityException: Requires READ_PHONE_STATE: Neither user 10030 nor current process has android.permission.READ_PHONE_STATE.
Android6.0(API23)以前からある原因としては、
AndroidManifest.xmlにandroid.permission.READ_PHONE_STATE を許可していないというのがあり、単純に追加して終わっていました。
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
Android6.0(API23)からは、端末側でも許可しないとAndroidManifest.xmlに許可コードを記載していても、同じエラーが出力されます。
ややこしい。。。
試作とかで適当な動作確認程度だと、端末の設定アプリから手動で許可すれば楽です。
実際に、リリースするようなアプリの場合、端末が許可していない場合に許可を促すような処理を行ってあげる必要があります。
実装例
READ_PHONE_STATEのパーミッション許可が必要なアプリ
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (ContextCompat.checkSelfPermission(this,android.Manifest.permission.READ_PHONE_STATE)== PackageManager.PERMISSION_GRANTED){
// 許可されている時の処理
hogehoge();
}else{
// 拒否されている時の処理
if (ActivityCompat.shouldShowRequestPermissionRationale(this, android.Manifest.permission.READ_PHONE_STATE)) {
// 拒否されている時 (一度、requestPermissionsで拒否されているとこちらに来る)
// 再度許可を求める
ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.READ_PHONE_STATE}, 0);
} else {
// 許可を求めるダイアログを表示
ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.READ_PHONE_STATE}, 0);
}
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case 0: {
// ActivityCompat#requestPermissions()の第2引数で指定した値
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 許可された場合の処理
hogehoge();
}else{
// 拒否された場合の処理
}
break;
}
}
}
参考:Android 6.0のRuntime Permissionに対応する
https://firespeed.org/diary.php?diary=kenz-1821
(リンク切れ)
細かい内容も含めて丁寧に説明されています。
コメント