2016-10-18 2 views
4

Ich versuche, die Kamera Erlaubnis vom Benutzer zu bekommen, bevor ich meine Kameraaktivität startet. onRequestPermissionsResult wird nie zurückgerufen, nachdem der Benutzer im Berechtigungsdialog "Zulassen" gedrückt hat. Hier ist meine Aktivitätsklasse:onRequestPermissionsResult wird nicht in einer android Aktivität zurückgerufen

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

Hier ist meine App-Manifest mit der Kamera Berechtigung:

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

Meine Gradle Abhängigkeit:

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

Haben Sie die 'CAMERA' Erlaubnis im Manifest [an der richtigen Stelle] (https://commonsware.com/blog/2015/08/31/hey-where-did-my-permission-go.html)? – CommonsWare

+0

@CommonsWare Ich habe meine Manifest-Informationen zur Frage hinzugefügt. Ja, ich habe die Erlaubnis. Ich kann die Erlaubnis bekommen, zu arbeiten. Aber der Rückruf wird nicht angerufen. – ssk

Antwort

6

Ich versuchte, mich Ihren Code und alles funktioniert einfach fein. Ich denke, dass das einzige, was ein Problem ist das Szenario sein kann, wenn Sie Ihre Aktivität, diese beiden Fahnen hat:

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

Hier ist ein Typ, der das Problem ist, erklärt: https://stackoverflow.com/a/35772265/5281581

+0

Danke für den Versuch. Entfernen android: noHistory = "wahr" arbeitete für mich. – ssk

+0

FLAG_ACTIVITY_NO_HISTORY haben folgende Funktion. [int FLAG_ACTIVITY_NO_HISTORY Wenn festgelegt, wird die neue Aktivität nicht im Verlaufsstapel gespeichert. Sobald der Benutzer davon weg navigiert, ist die Aktivität beendet. Dies kann auch mit dem noHistory-Attribut festgelegt werden. Wenn gesetzt, wird onActivityResult() niemals aufgerufen, wenn die aktuelle Aktivität eine neue Aktivität startet, die ein Ergebnis setzt und beendet. ] Wenn requestPermission() aufgerufen wird, wird die Aktivität zerstört. So kann das Ergebnis nicht erhalten. – inhogo

Verwandte Themen