2016-06-28 7 views
0

は私が私がCamera2APIと協力し、私は私がすべきGoogleのドックに応じマシュマロの権限と説明

dinamicly permishionを依頼する
private void openCamera(int width, int height) { 
    setUpCameraOutputs(width, height); 
    CameraHelper.configureTransform(width, height, textureView, previewSize, getActivity()); 
    CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); 

    try { 
     if (!cameraOpenCloseLock.tryAcquire(2500, TimeUnit.MILLISECONDS)) { 
      throw new RuntimeException("Time out waiting to lock camera opening."); 
     } 

     if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != 
       PackageManager.PERMISSION_GRANTED) { 

      // Should we show an explanation? 
      if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) { 

       // Show an explanation to the user *asynchronously* -- don't block 
       // this thread waiting for the user's response! After the user 
       // sees the explanation, try again to request the permission. 

      } else { 
       // No explanation needed, we can request the permission. 

       ActivityCompat.requestPermissions(
         getActivity(), new String[]{android.Manifest.permission.CAMERA}, 
         MY_PERMISSIONS_REQUEST); 

       // MY_PERMISSIONS_REQUEST is an 
       // app-defined int constant. The callback method gets the 
       // result of the request. 
      } 
     } 

     manager.openCamera(mCameraId, mStateCallback, mBackgroundHandler); 
    } catch (CameraAccessException e) { 
     e.printStackTrace(); 
    } catch (InterruptedException e) { 
     throw new RuntimeException("Interrupted while trying to lock camera opening.", e); 
    } 
} 

をコードする、このようなスニペットを実装するユーザー権限

に説明する必要がありますかplaese説明してもらえチェックユーザーが

前に許可を拒否した場合はfalse

shouldShowRequestPermissionRationale(); 
01のtrueを返す方法があります

とGoogle

アプリは、以前にこの権限を要求していると、ユーザが要求を拒否した場合、このメソッドがtrueを返す応じ。

私はこのメソッドの実装の内部に正しく従ったグーグルのコメントを理解していれば

//非同期ユーザーへの説明を表示 - を待っ

//このスレッドをブロックしませんのユーザーの応答!ユーザーの後に

//説明が表示されたら、もう一度アクセス許可をリクエストしてください。

そして最後に、たとえばユーザーが前に私の許可を拒否し、彼はカメラアプリで自分の画面に行く次回は、「あなたが継続する場合は、このpermishionを同意してください」との説明と私のcastomポップアップを作成する必要があります例のユーザーがこの時間に同意したので、私はこの方法を再度呼び戻してください。

//説明が表示され、再度許可を要求してみてください。

が、再び私には、この方法は

shouldShowRequestPermissionRationale(); 

リターンtrue、それは許可に同意するユーザの意図を知っていなかったので。

どうすればいいですか?多分あなたは例を持っていますか?

+0

のようにそれを実装http://stackoverflow.com/a/41221852/5488468 –

答えて

4

結局、私は@nuuneoiのHALPで解決策を見つける、どうもありがとう!

そして、それが仕事かもしれこれを試してみてください。この

public void camera(View view) { 
    toCamera(); 
} 

private void toCamera() { 
    if (!isCheckPermission()){ 
     return; 
    } 

    if (isProcessWasFinish()) { 
     startActivity(new Intent(getApplicationContext(), CameraActivity.class)); 
     overridePendingTransition(R.anim.open_next, R.anim.close_main); 
    } else { 
     startActivity(new Intent(getApplicationContext(), UserDataScreen.class)); 
     overridePendingTransition(R.anim.open_next, R.anim.close_main); 
    } 
} 

private boolean isCheckPermission() { 
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != 
      PackageManager.PERMISSION_GRANTED) { 

     // Should we show an explanation? 
     if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) { 
      showMessageOKCancel("You need to allow access to Camera"); 
      return false; 
     } 

     // No explanation needed, we can request the permission. 

     ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.CAMERA}, 
       MY_PERMISSIONS_REQUEST); 
     return false; 
     // MY_PERMISSIONS_REQUEST is an 
     // app-defined int constant. The callback method gets the 
     // result of the request. 
    } 

    return true; 
} 

private void showMessageOKCancel(String message) { 
    new AlertDialog.Builder(MainActivity.this) 
      .setMessage(message) 
      .setPositiveButton("OK", listener) 
      .setNegativeButton("Cancel", listener) 
      .create() 
      .show(); 
} 

DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener() { 

    final int BUTTON_NEGATIVE = -2; 
    final int BUTTON_POSITIVE = -1; 

    @Override 
    public void onClick(DialogInterface dialog, int which) { 
     switch (which) { 
      case BUTTON_NEGATIVE: 
       // int which = -2 
       dialog.dismiss(); 
       break; 

      case BUTTON_POSITIVE: 
       // int which = -1 
       ActivityCompat.requestPermissions(
         MainActivity.this, new String[]{android.Manifest.permission.CAMERA}, 
         MY_PERMISSIONS_REQUEST); 
       dialog.dismiss(); 
       break; 
     } 
    } 
}; 

@Override 
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, 
             @NonNull int[] grantResults) { 
    switch (requestCode) { 
     case MY_PERMISSIONS_REQUEST: { 
      // If request is cancelled, the result arrays are empty. 
      if (grantResults.length > 0 
        && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
       Log.e(MY_LOG, "Camera permission Granted"); 
       // permission was granted, yay! Do the 
       // contacts-related task you need to do. 

       toCamera(); 

      } else { 
       Log.e(MY_LOG, "Camera permission Denied"); 
       // permission denied, boo! Disable the 
       // functionality that depends on this permission. 
      } 
     } 
     default: { 
      super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
     } 

     // other 'case' lines to check for other 
     // permissions this app might request 
    } 
} 
1

ちょっと、あなたは、アプリの起動時にユーザー権限を求めるのに最適なライブラリをいくつか使うことができます。

アンドロイドであることあなたが助けるための素晴らしいライブラリがあります:

Github link for the Permission dispatcher library

あなたが許可ディスパッチャライブラリの使用例にhere

を見つけることができますが、あなたはまた、これらのライブラリを確認することができます。

App-Runtime-Permissions-Android

Assent

MarshmallowPermissionManager

関連する問題