2

したがって、このまったく新しい Android ランタイムのアクセス許可は、私を混乱させました。私のアプリは現在、バージョン 23 をコンパイルしてターゲットにしているため、実行時のアクセス許可を使用する必要があります。私のアプリは主にカメラのアクセス許可を必要とするカメラ API を使用するため、カメラを開く前にランタイムのアクセス許可を追加しました。

        if (ContextCompat.checkSelfPermission(this,
                Manifest.permission.CAMERA)
                != PackageManager.PERMISSION_GRANTED)
        {//ask permissions for camera
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.CAMERA},
                    CameraPermissions);
        }
        else
        {//permissions attained now you can open the camera
            camera=Camera.open(getCid());
            camera.setPreviewCallback(this);
            initPreview(width, height);
            startPreview();
            startTimer();
        }

カメラを停止するときも確認します。

       if (ContextCompat.checkSelfPermission(this,
                Manifest.permission.CAMERA)
                == PackageManager.PERMISSION_GRANTED) {
            camera.setPreviewCallback(null);
            camera.release();
            faceProc.release();
            faceProc = null;
            camera = null;
            inPreview = false;
            cameraConfigured = false;
        }

許可要求は次のように処理されます。

@Override
public void onRequestPermissionsResult(int requestCode,
                                       String permissions[], int[] grantResults) {
    switch (requestCode) {
        case CameraPermissions: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                StartUpCam();
            } else {

                // permission denied, boo! Disable the
                // functionality that depends on this permission.
                AlertDialog.Builder builder = new AlertDialog.Builder(this);
                builder.setMessage("How is this app going to work if you rejected the camera permission.... DUHHHH!!")
                        .setTitle("Rejected");
                builder.setPositiveButton("Exit App", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        //close application
                        closeApp();
                    }
                });
                AlertDialog dialog = builder.create();
                dialog.show();
            }
            return;
        }
    }
}

そのため、リクエストが与えられると、 StartUpCam が呼び出され、権限が与えられた場合にカメラを開こうとします。ここで私の質問があります。このランタイム許可チェックを追加すると、これは 6.0 より前の Android デバイスにどのように影響しますか?? バージョン 5.0.1 の電話でも、カメラの許可を求めるプロンプトが表示されるのでしょうか? 実行時のアクセス許可を使用する場合、マニフェスト ファイルでカメラのアクセス許可を削除する必要がありますか? 現在、マニフェストにカメラのアクセス許可と、それが正しいかどうかわからない実行時のアクセス許可を保持しています。ターゲットを下げ、sdk を 23 ではなく 22 にコンパイルすると、6.0 を超える Android デバイスでアプリをダウンロードできなくなりますか? バージョン 22 に下げると、この頭痛の種をすべて回避できます...

4

2 に答える 2

1

カメラを止めるタイミングもチェック

一度も開いていないカメラを停止しようとしないと仮定すると、これは必要ありません。アプリの実行中にユーザーがアクセス許可を取り消すと、プロセスはすぐに終了します。その結果、実行中のアプリでアクセス許可が失われることはありません。カメラを確認して開く権限を持っていたので、カメラを閉じる権限が既にあります。

この実行時パーミッション チェックを追加すると、6.0 より前の Android デバイスにどのような影響がありますか?

ContextCompat.checkSelfPermission()PackageManager.PERMISSION_GRANTEDマニフェストにリストされている権限があると仮定すると、古いデバイスで返されます。

バージョン 5.0.1 の電話でも、カメラの許可を求めるプロンプトが表示されるのでしょうか?

いいえ。

実行時のアクセス許可を使用する場合、マニフェスト ファイルでカメラのアクセス許可を削除する必要がありますか?

いいえ。これらの要素は、すべての Android バージョンで必要です。

ターゲットを下げて sdk を 23 ではなく 22 にコンパイルすると、6.0 を超える Android デバイスでアプリをダウンロードできなくなりますか?

compileSdkVersionサポートする Android のバージョンに影響はありません。Android 6.0 ユーザーは引き続きアプリをダウンロードできます。

22 以下に下げtargetSdkVersionても、サポートする Android のバージョンには影響しません。Android 6.0 ユーザーは引き続きアプリをダウンロードできます。これを行うと、ランタイム許可コードをスキップできることを意味します。ただし、まだ許可されていない可能性があることに注意してください。targetSdkVersion22 アプリを実行している Android 6.0 デバイスのユーザーはCAMERA、デフォルトで権限を付与します。ただし、これらのユーザーは引き続き [設定] > [アプリ] に移動し、アプリを見つけて、権限を取り消すことができます。カメラ API では、基本的にカメラを開くことはできません。

戦術的にはtargetSdkVersion、22以下で行くことは確かに可能です. しかし最終的には、何かが「あなたの手札を強要」しtargetSdkVersion、23 以上に移動する必要があります。そのため、いつの日か、実行時のアクセス許可を処理する必要があります。それが今日なのか、将来のいつかなのかは、あなた次第です。

于 2016-02-07T00:32:19.307 に答える
0

許可が Menifest ファイルにある場合はいいえ。SDK が 23 未満の Android では、許可に関するプロンプトは表示されません。以前と同じです。

于 2016-02-07T00:33:08.700 に答える