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?
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();
}
}
}
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.
Ü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.
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.