質問...
下位互換性を維持しながら、Android Marshmallow にランタイム権限を実装しようとしています。以前はこれでうまくいきましたが、今回は何が違うのかわかりません。物理的な Note 5 (Mallow を実行) でテストし、Marshmallow でセットアップされたエミュレーターを使用してテストしましたが、どちらも機能しません。
「うまくいかない」はあまり役に立たないことはわかっていますが、他に何を言うべきかわかりません。何も起こりません。アプリはクラッシュせず、requestPermissions(perms, 222)
呼び出された後にハングします。
私は何を間違っていますか?
詳細...
私の活動の関連部分:
public class HomeActivity extends Activity implements View.OnClickListener {
@Override
public void onClick(View v) {
switch(v.getId()){
case R.id.btn_home_scancertificate:
if (ContextCompat.checkSelfPermission(HomeActivity.this, "android.permission.CAMERA") != PackageManager.PERMISSION_GRANTED){
showNoPermDialog();
}else {
AppData.ActionType = ActionType.SCAN_CERTIFICATE;
intent = new Intent(HomeActivity.this, CaptureActivity.class);
startActivity(intent);
}
break;
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
Log.e("HomeActivity", "Permissions results...");
switch (requestCode) {
case 222: {
boolean granted = (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED);
Log.e("HomeActivity", granted?"granted permission":"denied permission");
AppData.ActionType = ActionType.SCAN_POSTCARD;
intent = new Intent(HomeActivity.this, CaptureActivity.class);
startActivity(intent);
}
}
}
public void getCamPerm(){
Log.e("HomeActivity", "Build version: "+Build.VERSION.SDK_INT);
if (Build.VERSION.SDK_INT >= 23) {
Log.e("HomeActivity", "Getting permissions");
String[] perms = new String[]{Manifest.permission.CAMERA};
requestPermissions(perms, 222);
}
}
public void showNoPermDialog(){
if (Build.VERSION.SDK_INT >= 23) {
boolean showRationale = shouldShowRequestPermissionRationale(Manifest.permission.CAMERA);
String status = showRationale ? "showing rationale" : "skipping rationale";
Log.e("HomeActivity", status);
if (showRationale) {
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
alertDialogBuilder.setTitle("Need permission");
alertDialogBuilder
.setMessage("App requires camera permission for the use of the scanner.")
.setCancelable(false)
.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
getCamPerm();
}
});
AlertDialog alertDialog = alertDialogBuilder.create();
alertDialog.show();
}else getCamPerm();
}else {
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
alertDialogBuilder.setTitle("Need permission");
alertDialogBuilder
.setMessage("App requires permission to use the camera. You have disabled camera permission. Please re-enable this permission thru Settings -> Apps -> Our Town -> Permissions.")
.setCancelable(false)
.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});
AlertDialog alertDialog = alertDialogBuilder.create();
alertDialog.show();
}
}
}
実行すると、これらのみがログに記録されます (onRequestPermissionsResult()
はまったく呼び出されません)。
E/HomeActivity: スキップの理由
E/HomeActivity: ビルド バージョン: 23
E/HomeActivity: アクセス許可の取得
マニフェストには以下が含まれます。<uses-permission android:name="android.permission.CAMERA" />
編集
ボタンを初めてクリックしたときにのみ、これが Logcat に表示され、への呼び出しによってトリガーされるようです。shouldShowRequestPermissionRationale()
08-17 11:26:36.996 20660-20660/com.ourtownamerica.ourtowntrutrak W/ViewRootImpl: Cancelling event due to no window focus: MotionEvent { action=ACTION_CANCEL, actionButton=0, id[0]=0, x[0]=1035.6592, y[0]=770.2344, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=8508970, downTime=8506643, deviceId=0, source=0x1002 }
08-17 11:26:36.996 20660-20660/com.ourtownamerica.ourtowntrutrak W/ViewRootImpl: Cancelling event due to no window focus: MotionEvent { action=ACTION_CANCEL, actionButton=0, id[0]=0, x[0]=1035.6592, y[0]=770.2344, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=8508970, downTime=8506643, deviceId=0, source=0x1002 }
08-17 11:26:36.996 20660-20660/com.ourtownamerica.ourtowntrutrak W/ViewRootImpl: Cancelling event due to no window focus: MotionEvent { action=ACTION_CANCEL, actionButton=0, id[0]=0, x[0]=1035.6592, y[0]=770.2344, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=8508970, downTime=8506643, deviceId=0, source=0x1002 }
08-17 11:26:36.997 20660-20660/com.ourtownamerica.ourtowntrutrak W/ViewRootImpl: Cancelling event due to no window focus: MotionEvent { action=ACTION_CANCEL, actionButton=0, id[0]=0, x[0]=1035.6592, y[0]=770.2344, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=8508970, downTime=8506643, deviceId=0, source=0x1002 }
編集2
同じ元のコードをアクティビティからコピーし、スプラッシュ アクティビティに移動したところ、そこで正常に動作しました。今のところそこにとどまることができますが、何が起こっているのか知っている人がいれば、入力を歓迎します。