AndroidのRuntime Permission Request
かなり前にAndroidシステムパーミッションで設定画面から個別にPermissionを許可する方法を書いたが、アプリでダイアログを表示する方法を調べようとしてずっと放っておいた。調べていじってみたのでまた書く。
今回のPermission
今回は過去に作成した録音アプリを利用するため、以下のPermissionを使用する。
AndroidManifest.xml
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.VIBRATE"/>
コード
MainActivityでPermissionのダイアログ表示や許可を行い、完了したらstartRecordingActivityに遷移して録音を開始する、という流れ。
MainActivity.java
package com.example.testrecordingpermission;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.Manifest;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private final int REQUEST_CODE = 1000;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Android 6, API 23以上でパーミッションの確認
if(Build.VERSION.SDK_INT >= 23) {
String[] permissions = {
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.RECORD_AUDIO,
Manifest.permission.VIBRATE
};
checkPermission(permissions, REQUEST_CODE);
}
startRecordingActivity();
}
// 位置情報許可の確認
public void checkPermission(final String[] permissions,final int request_code){
// 許可されていないものだけダイアログが表示される
ActivityCompat.requestPermissions(this, permissions, request_code);
}
// requestPermissionsのコールバック
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
switch(requestCode) {
case REQUEST_CODE:
for(int i = 0; i < permissions.length; i++ ){
if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {
Toast toast = Toast.makeText(this,
"Added Permission: " + permissions[i], Toast.LENGTH_SHORT);
toast.show();
} else {
Toast toast = Toast.makeText(this,
"Rejected Permission: " + permissions[i], Toast.LENGTH_SHORT);
toast.show();
}
}
break;
default:
break;
}
}
// Intent でstartRecording
private void startRecordingActivity() {
Intent intent = new Intent(getApplication(), RecordingActivity.class);
startActivity(intent);
}
}
結果
VIBRATEのPermissionは許可が必要ないのでWRITE_EXTERNAL_STRAGEとRECORD_AUDIOのダイアログが表示される。成功。
ダイアログ表示・許可が成功したが、アプリ起動時には表示されず、一度アプリを終了させて初めて表示された。本当はアプリ起動後すぐに表示されてほしい。また調べる。