1

質問...

下位互換性を維持しながら、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

同じ元のコードをアクティビティからコピーし、スプラッシュ アクティビティに移動したところ、そこで正常に動作しました。今のところそこにとどまることができますが、何が起こっているのか知っている人がいれば、入力を歓迎します。

4

3 に答える 3

0

では、「android.permission.CAMERA」の代わりに Manifest.permission.CAMERA を使ってみてください。

また、コードの品質については、ボタンでAndroid が 23 であるかどうかを確認してくださいR.id.btn_home_scancertificate:

if (Build.VERSION.SDK_INT >= 23 && ContextCompat.checkSelfPermission(activity,
            Manifest.permission.CAMERA)
            != PackageManager.PERMISSION_GRANTED) {

        showNoPermDialog();

    } else {
        AppData.ActionType = ActionType.SCAN_CERTIFICATE;
                intent = new Intent(HomeActivity.this, CaptureActivity.class);
                startActivity(intent);
    }

    //in alertdialog button simply place this for requesting permission
    ActivityCompat.requestPermissions(activity,
            new String[]{Manifest.permission.CAMERA},
            222);
于 2016-08-17T14:39:00.277 に答える
-1

shouldShowRequestPermissionRationale()問題は、許可を求める前に電話をかけたことに起因する可能性があります。これに対してログに記録されたバグがあり ( here )、Google の例/チュートリアルの一部がこのパターンに従っているため、特にひどいものです。

これを解決するには、アクセス許可を確認し、許可されていない場合は要求してください。根拠を示す必要があるonRequestPermissionsResult()かどうかをチェックします。trueこれは、ユーザーが許可拒否し、再度要求されないようにするオプションを選択していない場合にのみ返されます。

Andeleライブラリを使用すると、これと推奨される UX ガイドラインを簡単に処理できる場合があります。

于 2016-08-17T18:41:11.857 に答える