web-dev-qa-db-de.com

Lese- und Schreibberechtigung zum Speichern und Galeriebenutzung für Marshmallow

Ich entwickle eine Android-App, in der die Erlaubnis für das Lesen und Schreiben von externem Speicher erteilt werden muss. Meine Anforderung ist, ein Bild aus der Galerie auszuwählen und in meiner App zu verwenden. Alles funktioniert gut, außer Marshmallow-Geräten. Ich möchte die Erlaubnis für Marshmallow geben. Kann mir jemand dabei helfen?

9
tiger

Es kann etwas wie folgt erreicht werden ...

public class MainActivity extends AppCompatActivity implements ActivityCompat.OnRequestPermissionsResultCallback{

  private static final int REQUEST_WRITE_PERMISSION = 786;

  @Override
  public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    if (requestCode == REQUEST_WRITE_PERMISSION && grantResults[0] == PackageManager.PERMISSION_GRANTED) {            
        openFilePicker();
    }
  }

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    requestPermission();
  }

  private void requestPermission() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        requestPermissions(new String[]{Android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_WRITE_PERMISSION);
    } else {
        openFilePicker();
    }
  }
}
20
Khan

Durchlesen Laufzeitberechtigungen - Android M und sein Referenzprojekt .

Der Berechtigungsfluss wurde geändert, sodass die Berechtigungen zur Laufzeit vorzugsweise nach Bedarf abgefragt werden müssen. Mit den gleichen Berechtigungen wurden auch in Normal und Dangerous kategorisiert, was auch zu Berechtigungsgruppen führt. 

2
Pararth

Überprüfung jeder Situation

wenn verweigert - Zeigt dem Benutzer den Alert-Dialog an, warum wir eine Berechtigung benötigen

public static final int STORAGE_PERMISSION_REQUEST_CODE= 1;


    private void askPermissions() {

    int permissionCheckStorage = ContextCompat.checkSelfPermission(this,
            Manifest.permission.WRITE_EXTERNAL_STORAGE); 

   // we already asked for permisson & Permission granted, call camera intent
    if (permissionCheckStorage == PackageManager.PERMISSION_GRANTED) {

        //do what you want

    } else {

           // if storage request is denied
        if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setMessage("You need to give permission to access storage in order to work this feature.");
            builder.setNegativeButton("CANCEL", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    dialogInterface.dismiss();
                }
            });
            builder.setPositiveButton("GIVE PERMISSION", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    dialogInterface.dismiss();

                    // Show permission request popup
                    ActivityCompat.requestPermissions(this,
                            new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                            STORAGE_PERMISSION_REQUEST_CODE);
                }
            });
            builder.show();

        } //asking permission for first time 
          else {
             // Show permission request popup for the first time
                        ActivityCompat.requestPermissions(AddWorkImageActivity.this,
                                new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                                STORAGE_PERMISSION_REQUEST_CODE);

                    }

    }
}

Berechtigungsergebnisse prüfen

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

    switch (requestCode) {
        case STORAGE_PERMISSION_REQUEST_CODE:
            if (grantResults.length > 0 && permissions[0].equals(Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                // check whether storage permission granted or not.
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    //do what you want;
                }
            }
            break;
        default:
            break;
    }
}

sie können diesen Code einfach kopieren und einfügen, er funktioniert einwandfrei. Ändern Sie den Kontext (dies) und die Berechtigungen nach Ihren Wünschen. 

0

Außerdem, wenn Sie nach mehreren Berechtigungen fragen möchten. Du kannst das.

private ArrayList<String> permisos;

private void someMethod()
{
      ..

      verificarPermisos(Manifest.permission.READ_EXTERNAL_STORAGE );
      verificarPermisos(Manifest.permission.ACCESS_FINE_LOCATION );
      verificarPermisos(Manifest.permission.ACCESS_COARSE_LOCATION );
      if (permisos.size()!=0)
      {
         solicitarPermisos(permisos.toArray(new String[permisos.size()]));
      }

      ..

 }


@TargetApi(23)
void verificarPermisos(String permiso){
    if (ContextCompat.checkSelfPermission(this,permiso)
            != PackageManager.PERMISSION_GRANTED) {
        permisos.add(permiso);
        // Should we show an explanation?
        if (shouldShowRequestPermissionRationale(permiso)) {

        }

    }
}

@TargetApi(23)
void solicitarPermisos(String[] permiso){

    requestPermissions(permiso, 1);

}

Zuerst überprüfe ich mit der Methode " verificarPermisos () ", ob die Berechtigung bereits erteilt wurde oder nicht. Wenn sie nicht gewährt werden, füge ich sie der Arrayliste " permisos " hinzu. Abschließend werden die nicht freigegebenen Berechtigungen erneut abgefragt, indem sie in einem String [] Array-Format übergeben werden. 

Beachten Sie, dass Sie nur seit MashMellow (API 23) oder höher Berechtigungen anfordern können. Wenn Ihre App auch Android-Versionen vor MashMellow anvisiert, können Sie die Annotation " @TargetApi () " verwenden und die Berechtigungsmethoden nur aufrufen, wenn das Ziel API 23 oder höher ist.
Hoffe zu helfen, Grüße.

0
Gian Gomen