2016-08-02 48 views
0

Ich habe Probleme mit der Handhabung von Laufzeitberechtigungen in Android Marshmallow und ich brauche wirklich eine Hand. Das Problem ist, wenn ich eine Laufzeitberechtigung verweigere (wenn das Dialogfeld erscheint), stürzt die App ab. Genauer gesagt, die Aktivität, die ich gerade aktiviere, wird neu gestartet (ich nenne es einfach einen App-Crash?). HierDenying Runtime Permission in Android Marshmallow Crashs App

ist der Code:

public void showContacts() { 

    if (CommonData.showLogs) { 
     Log.d(debugTag, "Show contacts button pressed. Checking permissions."); 
    } 

    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) 
      != PackageManager.PERMISSION_GRANTED 
      || ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_CONTACTS) 
      != PackageManager.PERMISSION_GRANTED) { 

     requestContactsPermissions(); 
    } else { 

     if (CommonData.showLogs) { 
      Log.d(debugTag, "Contact permissions have already been granted. Displaying contact details."); 
     } 

     // Do my Stuff 
    } 
} 

private void requestContactsPermissions() { 

    if (ActivityCompat.shouldShowRequestPermissionRationale(this, 
      Manifest.permission.READ_CONTACTS) 
      || ActivityCompat.shouldShowRequestPermissionRationale(this, 
      Manifest.permission.WRITE_CONTACTS)) { 

     Snackbar.make(rLParent, R.string.permission_contacts_rationale, 
       Snackbar.LENGTH_INDEFINITE) 
       .setAction(R.string.ok, new View.OnClickListener() { 
        @Override 
        public void onClick(View view) { 

         ActivityCompat 
           .requestPermissions(ImportContactsActivity.this, PERMISSIONS_CONTACT, 
             REQUEST_CONTACTS); 
        } 
       }) 
       .show(); 
    } else { 

     ActivityCompat.requestPermissions(ImportContactsActivity.this, PERMISSIONS_CONTACT, REQUEST_CONTACTS); 
    } 
} 

@Override 
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 


    if (requestCode == REQUEST_CONTACTS) { 

     if (PermissionUtil.verifyPermissions(grantResults)) { 

      // Do my Stuff 
     } else { 



      Snackbar.make(rLParent, R.string.permissions_not_granted, 
        Snackbar.LENGTH_SHORT) 
        .show(); 

     } 

    } else { 
     Log.d(debugTag, "Contacts permissions were NOT granted."); 
     super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
    } 

} 

Was mache ich falsch hier? Jede Hilfe würde sehr geschätzt werden. Vielen Dank!

+0

Bitte senden Sie Ihren LogCat-Absturzbericht - Es ist einfacher, das Problem auf diese Weise zu identifizieren –

+0

Es gibt keinen Logcat-Absturzbericht Sir. Es wird nur die Aktivität sofort neu starten. –

+0

ja, das ist eine unbehandelte Ausnahme. Normalerweise versucht Android, die Aktivität sofort nach einem Absturz zu starten ... In der Bereitstellung würde ich vorschlagen, dass Sie einige Absturzberichterstattungsmechanismen wie Crashlytics verwenden, um Abstürze auf Benutzergeräten zu behandeln – Kushan

Antwort

1

Versuchen Sie, die ausgeführten Aktionen mithilfe der Berechtigung in einem Try-catch-Block auszuführen und eine Meldung oder etwas anzuzeigen, wenn eine SecurityException auftritt.

Eg ... Ich benutze die folgenden für Location Berechtigungen nach für die Berechtigungen fragen ...

Fehlertext ein Textview in der Mitte des Bildschirms angezeigt ist, zu zeigen, was der Benutzer tun muss ...

  try { 

       LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); 


      }catch (SecurityException se){ 
       Log.d("FragmentCreate","You don't have permissions"); 

       errortext.setVisibility(View.VISIBLE); 
       errortext.setText("Please provide Location permission to continue, Settings->Apps->RecommendedApp->Permissions"); 
       Toast.makeText(this,"Please provide location permissions to continue",Toast.LENGTH_SHORT).show(); 
      } 

Alternativ:

Sie auch dialogfragment innerhalb der catch-Block mit einem Knopf zeigen kann den Benutzer auf die Einstellungen Bildschirm Ihres app.You nehmen können startActivityForResult() tun und für den zurückgegebenen Wert warten und prüfen, ob die Erlaubnis ion exists

+0

Vielen Dank, Sir, ich werde an diesem Ansatz arbeiten, den Sie gegeben haben. –

+0

Nein Herr, Mann ... nur ein normaler Entwickler :) Wie auch immer, als allgemeine Faustregel, führen Sie immer riskante Operationen in einem Versuch-Fang, um unerwartete Ergebnisse zu behandeln ... – Kushan

+0

Au, tut mir leid. Hahaha, trotzdem vielen Dank! –