###前提・実現したいこと
現在AndroidStudioでカメラアプリを作成しています。機能の作成は完了したのですが、作成したアプリを使用予定の実機がAndroid6.0で、Runtimepermissionの対応が必要なのですがなかなか上手くいきません。私の希望ではパーミッション許可の流れを以下のように進めたいです。
アプリ起動(インストール初回起動)
↓
カメラ使用のパーミッション許可を求めるダイアログ
↓
オーディオのパーミッション許可を求めるダイアログ
↓
ストレージ使用のパーミッション許可を求めるダイアログ
↓
カメラオープン(プレビュー表示)
という流れが理想です。
###発生している問題・エラーメッセージ
現在実機にアプリをインストールして起動すると、パーミッション許可を求めるダイアログが表示される前にアプリがRuntimeExceptionにより終了してしまっています。アプリが終了しました〜という旨のメッセージの後ろに許可を求めるダイアログ表示されており、アプリが終了しました〜のメッセージをOKを選択してアプリを完全に停止した後にパーミッション許可を押す形になってしまっています。しかも、このダイアログボックスが一度にすべて表示されません(参考にしたサイトでは1/3のように一度のダイアログ表示でよいようになっていた)なので、アプリ起動→終了→ダイアログ表示の動作を3回繰り返さなければならない状態にあります。(全てのパーミッションを許可すればアプリの起動に問題はありません)
どうかどのようにコーディングしていけば良いかご教授お願いします。
以下エラーログです。
08-26 17:04:36.424 6846-6846パッケージ名 I/Process: Sending signal. PID: 6846 SIG: 9 08-26 17:04:37.671 6940-6940パッケージ名 W/System: ClassLoader referenced unknown path: /data/appパッケージ名-1/lib/arm64 08-26 17:04:37.773 6940-6940パッケージ名 W/System: ClassLoader referenced unknown path: /data/appパッケージ名-1/lib/arm64 08-26 17:04:37.827 6940-6940パッケージ名 D/AndroidRuntime: Shutting down VM 08-26 17:04:37.827 6940-6940パッケージ名 E/AndroidRuntime: FATAL EXCEPTION: main Process: パッケージ名, PID: 6940 java.lang.RuntimeException: Unable to start activity ComponentInfo{パッケージ名パッケージ名.MainActivity}: java.lang.ArrayIndexOutOfBoundsException: length=2; index=2 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2455) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2541) at android.app.ActivityThread.access$900(ActivityThread.java:169) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1382) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5554) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:746) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:636) Caused by: java.lang.ArrayIndexOutOfBoundsException: length=2; index=2 at パッケージ名.MainActivity.requestPermissions(MainActivity.java:123) at パッケージ名.MainActivity.checkPermission(MainActivity.java:112) at パッケージ名.MainActivity.onCreate(MainActivity.java:50) at android.app.Activity.performCreate(Activity.java:6285) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1108) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2408) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2541) at android.app.ActivityThread.access$900(ActivityThread.java:169) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1382) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5554) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:746) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:636)
###該当のソースコード
public class MainActivity extends Activity implements View.OnClickListener { private SurfaceView mySurfaceView; private Camera camera; private static final String TAG = "log"; private SurfaceHolder holder = null; private boolean recording = false; MediaRecorder mediaRecorder; private final int REQUEST_PERMISSION = 1000; private Button btn1; private Button btn2; @Override protected void onCreate(Bundle savedInstanceState) { checkPermission(); Log.v( "Check", "permission" ); super.onCreate( savedInstanceState ); File dirs = new File( "storage" ); if (!dirs.exists()) { dirs.mkdir(); } } private void prepareCamera(){ setContentView( R.layout.activity_main ); btn1 = (Button) findViewById( R.id.button1 ); btn1.setOnClickListener( this ); btn2 = (Button) findViewById( R.id.rebtn ); btn2.setOnClickListener( this ); mySurfaceView = (SurfaceView) findViewById( R.id.surface_view ); holder = mySurfaceView.getHolder(); holder.addCallback( callback ); Log.v( "Holder", "ok" ); holder.setType( SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS ); Log.v( TAG, "Holder" + holder ); } private boolean checkPermission() { boolean camP; boolean recP; boolean strP; if (ActivityCompat.checkSelfPermission( this, Manifest.permission.CAMERA ) != PackageManager.PERMISSION_GRANTED) { camP=false; }else { camP=true; } if (ActivityCompat.checkSelfPermission( this, Manifest.permission.RECORD_AUDIO ) != PackageManager.PERMISSION_GRANTED) { recP=false; }else { recP=true; } if (ActivityCompat.checkSelfPermission( this, Manifest.permission.WRITE_EXTERNAL_STORAGE ) != PackageManager.PERMISSION_GRANTED) { strP=false; }else { strP=true; } requestPermissions(camP,recP,strP); Log.v( "request","permission" ); return camP && recP && strP; } private void requestPermissions(boolean camP, boolean recP, boolean strP) { boolean pList[]= new boolean[2]; pList[0] = camP; pList[1] = recP; pList[2] = strP; for (int i=0;i<pList.length;i++){ if (pList[i]){ switch (i){ case 0: ActivityCompat.requestPermissions( MainActivity.this, new String[]{Manifest.permission.CAMERA}, REQUEST_PERMISSION ); break; case 1: ActivityCompat.requestPermissions( MainActivity.this, new String[]{Manifest.permission.RECORD_AUDIO}, REQUEST_PERMISSION ); break; case 2: ActivityCompat.requestPermissions( MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_PERMISSION ); break; } } } } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { if (requestCode == REQUEST_PERMISSION) { // 使用が許可された if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { prepareCamera(); return; } } } 以下文字数の関係で省略。
###試したこと
課題に対してアプローチしたことを記載してください
上記のソースコードは以下のサイトを参考にして書きました
https://akira-watson.com/android/runtime-permission.html
http://firespeed.org/diary.php?diary=kenz-1821
http://qiita.com/incheon/items/178cb540b697cd9419fd
###補足情報(言語/FW/ツール等のバージョンなど)
環境:AndroidStudio2.1.1
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/08/23 23:35
2016/08/24 00:37
2016/08/24 02:21
2016/08/24 02:35
2016/08/24 03:08
2016/08/24 03:17
2016/08/24 05:18
2016/08/24 06:08 編集
2016/08/24 06:36 編集
2016/08/24 06:49
2016/08/24 09:13 編集
2016/08/24 09:39
2016/08/25 02:28
2016/08/25 03:09
2016/08/25 07:39
2016/08/25 10:51
2016/08/26 08:39
2016/08/27 04:46
2016/08/30 03:42