2016-11-18 2 views
0

Die Situation: Wenn Kamera (Imageview) klicken, wird es mehrere Berechtigung aufgefordert.Android mehrere Erlaubnis Fehler

  1. Wenn Benutzer DENY mit 1. Berechtigung und 2. Berechtigung auswählen, funktioniert es.
  2. Wenn der Benutzer die Option ERLÄUTERUNG bei 1. Berechtigung und 2. Berechtigung auswählt, funktioniert es.
  3. Wenn Benutzer DENY auf 1. Erlaubnis und ERLAUBEN auf 2. Erlaubnis wählen, funktioniert es.
  4. Wenn der Benutzer bei der ersten Berechtigung die Option ALLOW und bei der zweiten Berechtigung DENY auswählt, wird ein Fehler angezeigt.

Hier Code (erweitert Fragment):

private static String[] PERMISSIONS_CAMERA = {Manifest.permission.READ_EXTERNAL_STORAGE, 
      Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA}; 


img_1 = (ImageView) view.findViewById(R.id.img_1); 
img_1.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       startCamera(); 
      } 
     });  
     private void StartCamera() { 
     requestPermissions(PERMISSIONS_CAMERA, REQUEST_CAMERA); 
    } 

    private void OpenCamera() { 
     Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
     startActivityForResult(intent, REQUEST_CAMERA); 
     this.bitmap = null; 
    } 
    @Override 
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
     super.onRequestPermissionsResult(requestCode, permissions, grantResults); 

    switch (requestCode) { 
      // For camera 
      case REQUEST_CAMERA: 
       if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
        OpenCamera(); 
       } else { 
        Toast.makeText(getActivity(), "Go to settings and enable permissions", Toast.LENGTH_LONG).show(); 
       } 
       break; 
    } 

} 

Fehlerprotokoll:

java.lang.RuntimeException: Failure delivering result 
    ResultInfo{[email protected]:requestPermissions:, request=131073, 
    result=-1, data=Intent { 
    act=android.content.pm.action.REQUEST_PERMISSIONS (has extras) }} to 
    activity {app.swb.mont/app.swb.mont.ui.activity.MainActivity}: 
    java.lang.SecurityException: Permission Denial: starting Intent { 
    act=android.media.action.IMAGE_CAPTURE 
    cmp=com.sec.android.app.camera/.Camera } from ProcessRecord{b2f7ceb 
    28260:app.swb.mont/u0a392} (pid=28260, uid=10392) with revoked 
    permission android.permission.CAMERA at android.app.ActivityThread.deliverResults(ActivityThread.java:4925) 
        at android.app.ActivityThread.handleSendResult(ActivityThread.java:4968) 
        at android.app.ActivityThread.access$1600(ActivityThread.java:222) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1849) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:158) 
        at android.app.ActivityThread.main(ActivityThread.java:7229) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 
       Caused by: java.lang.SecurityException: Permission Denial: starting Intent { act=android.media.action.IMAGE_CAPTURE 
cmp=com.sec.android.app.camera/.Camera } from ProcessRecord{b2f7ceb 
28260:app.swb.mont/u0a392} (pid=28260, uid=10392) with revoked 
permission android.permission.CAMERA 
+0

In Ihrem Schaltergehäuse grantResults.length> 0 wahr, aber u können versuchen, zu arbeiten, gab keine Kamera Erlaubnis so seine Ausnahme werfen – Raghavendra

+0

Überprüfen Sie speziell für die Kamera Erlaubnis beim Aufruf von OpenCamera() – Raghavendra

Antwort

1

Das Problem ist, dass Ihr nicht die onRequestPermissionResult richtig umgehen. Auf dieser Linie

if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
       OpenCamera();} 

Sie nur die erste Erlaubnis werden überprüft, die Ihre Wunsch-Hexe in diesem Fall Manifest.permission.READ_EXTERNAL_STORAGE ist (Position == 0) und Sie Ihre Kamera-Funktion Hexe auslösen bedürfen die Genehmigung an Position == 2

Lösung

if (grantResults.length > 0 && grantResults[2] == PackageManager.PERMISSION_GRANTED) { 
       OpenCamera();} 

ODER

if (grantResults.length > 0 && (grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED && grantResults[2] == PackageManager.PERMISSION_GRANTED)) { 
       OpenCamera();} 

// Sie können auch eine Schleife

+0

Ich sehe. Wie wäre es, wenn nur 1 Erlaubnis hätte. Funktioniert es immer noch für mehr als 1 Array? – Nizzam

+0

Gefunden die Lösungen! Danke Jungs. – Nizzam

0

verwenden, da Sie nur das erste Erlaubnissergebnis überprüfen und nicht das zweite: grantResults[0] == PackageManager.PERMISSION_GRANTED überprüfen. Sie müssen grantResults[1] == PackageManager.PERMISSION_GRANTED auch

0

Wenn Ihre Anforderung prüfen ist, ob alle Berechtigungen hat es dann nur gegeben Sie dieses

@Override 
    public void onRequestPermissionsResult(int requestCode, @NonNull String[]permissions, @NonNull int[] grantResults) { 
     super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
     switch (requestCode) { 
      // For camera 
      case REQUEST_CAMERA: 
       if (grantResults.length > 0) { 
        boolean permGiven = true; 
        for(int i=0; i<grantResults.length; i++){ 
         if(grantResults[i] != PackageManager.PERMISSION_GRANTED) 
          permGiven = false; 
        } 
        if(permGiven) 
         OpenCamera(); 
        else 
         Toast.makeText(MainActivity.this, "Go to settings and enable permissions", Toast.LENGTH_LONG).show(); 
       } else { 
        Toast.makeText(MainActivity.this, "Go to settings and enable permissions", Toast.LENGTH_LONG).show(); 
       } 
       break; 


     } 
    }