2016-10-18 12 views
4

カメラの操作を開始する前に、ユーザーからカメラのアクセス許可を取得しようとしています。ユーザが許可ダイアログから「許可」を押すと、onRequestPermissionsResultは返されません。ここに私のActivityクラスは次のとおりです。ここでonRequestPermissionsResultがアンドロイドアクティビティで呼び出されない

public class ImageCaptureActivity extends AppCompatActivity { 

    public static final String TAG = ImageCaptureActivity.class.getSimpleName(); 

    private static final int REQUEST_CAMERA = 0; 
    private static final int REQUEST_CAMERA_PERMISSION = 1; 
    private Point mSize; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_image_capture); 

     Display display = getWindowManager().getDefaultDisplay(); 
     mSize = new Point(); 
     display.getSize(mSize); 

     // Request for Camera Permission 
     requestForCameraPermission(findViewById(android.R.id.content)); 
    } 

    /** 
    * @param view 
    * @brief requestForCameraPermission 
    */ 
    public void requestForCameraPermission(View view) { 
     Log.v(TAG, "Requesting Camera Permission"); 

     final String permission = Manifest.permission.CAMERA; 
     if (ContextCompat.checkSelfPermission(ImageCaptureActivity.this, permission) 
       != PackageManager.PERMISSION_GRANTED) { 
      if (ActivityCompat.shouldShowRequestPermissionRationale(ImageCaptureActivity.this, permission)) { 
       showPermissionRationaleDialog(getString(R.string.camera_permission_rationale), permission); 
      } else { 
       requestForPermission(permission); 
      } 
     } else { 
      launch(); 
     } 
    } 

    /** 
    * @param message 
    * @param permission 
    * @brief showPermissionRationaleDialog 
    */ 
    private void showPermissionRationaleDialog(final String message, final String permission) { 
     new AlertDialog.Builder(ImageCaptureActivity.this) 
       .setMessage(message) 
       .setPositiveButton("Ok", new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         ImageCaptureActivity.this.requestForPermission(permission); 
        } 
       }) 
       .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int which) { 

        } 
       }) 
       .create() 
       .show(); 
    } 

    /** 
    * @param permission 
    * @brief requestForPermission 
    */ 
    private void requestForPermission(final String permission) { 
     ActivityCompat.requestPermissions(ImageCaptureActivity.this, new String[]{permission}, REQUEST_CAMERA_PERMISSION); 
    } 

    /** 
    * @brief launch 
    */ 
    private void launch() { 
     Log.v(TAG, "Camera Permission Granted, launching the CameraActivity"); 
     String documentId = getIntent().getStringExtra(IntentNames.INTENT_EXTRA_WIP_DOCUMENT_ID); 
     Intent startCustomCameraIntent = new Intent(this, CameraActivity.class); 
     startCustomCameraIntent.putExtra(IntentNames.INTENT_EXTRA_WIP_DOCUMENT_ID, documentId); 
     startActivityForResult(startCustomCameraIntent, REQUEST_CAMERA); 
    } 

    @Override 
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
     switch (requestCode) { 
      case REQUEST_CAMERA_PERMISSION: 
       final int numOfRequest = grantResults.length; 
       final boolean isGranted = numOfRequest == 1 
         && PackageManager.PERMISSION_GRANTED == grantResults[numOfRequest - 1]; 
       Log.v(TAG, "Camera Permission callback on onRequestPermissionsResult"); 
       if (isGranted) { 
        launch(); 
       } 
       break; 

      default: 
       super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
     } 
    } 
} 

は、カメラの許可を得て、私のアプリのマニフェストです:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.myapp.testpackage"> 

    <uses-permission android:name="android.permission.CAMERA" /> 

    <uses-feature 
     android:name="android.hardware.camera.front" 
     android:required="true" /> 
    <uses-feature android:name="android.hardware.camera2" /> 

    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 

    <application 

マイGradleの依存関係:

compile 'com.android.support:appcompat-v7:24.0.0' 

compile 'com.android.support:design:24.0.0' 

compile 'com.android.support:support-v4:24.0.0' 
+0

あなたは 'CAMERA'権限を持っています。ここでは、問題を説明している男だ

android:noHistory="true" android:excludeFromRecents="true" 

:私が問題になることができる唯一のことは、あなたの活動は、これら2つのフラグを持っている場合のシナリオであることを考えますマニフェスト[正しい場所](https://commonsware.com/blog/2015/08/31/hey-where-did-my-permission-go.html)にありますか? – CommonsWare

+0

@CommonsWare質問にマニフェスト情報を追加しました。はい、私は許可を持っています。私は許可を得られるようになっています。しかし、コールバックは呼び出されていません。 – ssk

答えて

6

私は自分自身とすべてがちょうど働くあなたのコードを試してみました良い。 https://stackoverflow.com/a/35772265/5281581

+0

お試しいただきありがとうございます。取り除く アンドロイド:noHistory = "true"が私のために働いた。 – ssk

+0

FLAG_ACTIVITY_NO_HISTORYには、次のような特徴があります。 [int FLAG_ACTIVITY_NO_HISTORY 設定した場合、新しいアクティビティは履歴スタックに保持されません。ユーザーがそれから離れて移動すると、アクティビティは終了します。これはnoHistory属性で設定することもできます。 設定されている場合、現在のアクティビティが新しいアクティビティを開始して結果を設定して終了すると、onActivityResult()は呼び出されません。 ] requestPermission()が呼び出されると、アクティビティは破棄されます。だから結果を得ることはできません。 – inhogo

関連する問題