2016-06-28 19 views
0

Könnte mir erklären plaese, wie ich an die Benutzerberechtigung erklären sollteEibisch Berechtigungen und Erklärung

i mit Camera2API arbeiten, und ich solche Code-Snippet implementieren permishion dinamicly

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); 
    } 
} 

nach google Docks zu fragen, ich sollte überprüfen, wenn der Benutzer die Erlaubnis verweigern, bevor

gibt es Verfahren, die von falschen

shouldShowRequestPermissionRationale(); 
01 true zurück

und

Diese Methode gibt true zurück, nach Google, wenn die App vorher diese Berechtigung angefordert hat und der Benutzer die Anforderung verweigert.

, wenn ich das richtig verstanden, nach Google Kommentare innerhalb dieser Methode Implementierung

// dem Benutzer eine Erklärung anzeigen asynchron - nicht blockieren

// diesen Thread wartet die Antwort des Benutzers! Nach dem Benutzer

// sieht die Erklärung, versuchen Sie es erneut, um die Erlaubnis zu verlangen.

Und schließlich zum Beispiel Benutzer verweigern meine Erlaubnis vor und beim nächsten Mal, wenn er mit der Kamera App zu meinem Bildschirm gehen sollte meine castom Pop-up mit Erklärung „Bitte stimmen diese permishion, wenn Sie den Vorgang fortsetzen möchten“ erstellen und für Beispiel Benutzer stimmen diese Zeit und ich sollte diese Methode wieder nach dieser

aufrufen // sieht die Erklärung, versuchen Sie es erneut, um die Erlaubnis zu verlangen.

aber diese Methode

shouldShowRequestPermissionRationale(); 

Rückkehr mir wieder true, weil es nicht mit Erlaubnis über die Benutzerabsicht zustimmen wußte.

Können Sie mir bitte erklären, wie man es richtig macht? Vielleicht hast du ein Beispiel?

+0

dieses Probieren Sie es Arbeit sein kann http://stackoverflow.com/a/41221852/5488468 –

Antwort

4

Schließlich finde ich eine Lösung mit halp von @nuuneoi, vielen Dank!

und umzusetzen wie diese

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 
    } 
}