2016-03-21 6 views
16

In einem Widget zeige ich Bilder von SDCard mit remoteView.setImageViewUri(). Diese Strategie funktioniert richtig außer mit Marshmallow:Anzeigen von Bildern von SDCard in einem Widget von MarshMallow

Der Fehler ist:

Unable to open content: file:///storage/emulated/0/Android/data/applicaitonPackage/files/file.png 
open failed: EACCESS (Permission denied) 

Es ist klar, dass dies ein Berechtigungsproblem ist, aber ich weiß nicht, wie Berechtigungen für den Widget-Container zu geben und in der Theorie (siehe Hinweis 1) Die Bilder sind bereits im freigegebenen Speicher gespeichert.

Anmerkung 1: Das Verzeichnis, in dem die Bilder gespeichert werden Environment.getExternalStorageDirectory() unter Lagerungs- geteilt wird

Anmerkung 2: Anwendung ist nicht auf Eibisch angepasst und verwendet targetSdkVersion = 15

Anmerkung 3: Don Antworte nicht einfach auf neue Laufzeitberechtigungen in MarshMallow. Ich kenne bereits Änderungen der Berechtigungen und das ist nicht das Problem, weil die Anwendung SDKVersion 15 ist und die App kein Problem beim Zugriff auf den externen Speicher hat, ist das Problem mit dem Widget-Container, der derjenige ist, den ich vermute, dass das nicht hat Berechtigungen.

Antwort

3

hi hier ist ein paar Schritte für die Einrichtung der Erlaubnis für Android M und denken Sie daran, Sie sollten die gleiche Berechtigung in Manifest-Datei als auch deklarieren.

Schritt 1. Deklarieren globale Variable:

public static final int MY_PERMISSIONS_REQUEST_LOCATION = 0; 

Schritt 2. Verwenden Sie diesen Code in Ihre Haupttätigkeit

private void locationpermission() { 
// Here, thisActivity is the current activity 
if (ContextCompat.checkSelfPermission(activity 
    , 
    Manifest.permission.ACCESS_COARSE_LOCATION) 
    != PackageManager.PERMISSION_GRANTED) { 

// Should we show an explanation? 
if (ActivityCompat.shouldShowRequestPermissionRationale(activity, 
     Manifest.permission.ACCESS_COARSE_LOCATION)) { 

    // Show an expanation to the user *asynchronously* -- don't block 
    // this thread waiting for the user's response! After the user 
    // sees the explanation, try again to request the permission. 

} else { 

    // No explanation needed, we can request the permission. 

    ActivityCompat.requestPermissions(activity, 
      new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, 
      MY_PERMISSIONS_REQUEST_LOCATION); 

    // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an 
    // app-defined int constant. The callback method gets the 
    // result of the request. 
} 
} 
} 

    @Override 
    public void onRequestPermissionsResult(int requestCode, 
           String permissions[], int[] grantResults)   { 
switch (requestCode) { 
case MY_PERMISSIONS_REQUEST_LOCATION: { 
    // If request is cancelled, the result arrays are empty. 
    if (grantResults.length > 0 
      && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

     // permission was granted, yay! Do the 
     // contacts-related task you need to do. 

    } else { 

     // permission denied, boo! Disable the 
     // functionality that depends on this permission. 
    } 
    return; 
} 

// other 'case' lines to check for other 
// permissions this app might request 
} 
} 

Schritt 3. Rufen Sie diese Methode in Ihrem oncreate Methode,

Standortpermission(); Und jede Erlaubnis, die Sie von hier aus aufrufen können und jedes Ergebnis, das Sie in Override-Methode onRequestPermissionsResult erhalten können.

thankyou

hoffe, dies wird Ihnen (Y) helfen.

bitte hier siehe Beispiel

https://www.dropbox.com/s/w29sljy0zpwwm61/MyApplication.zip?dl=0

+0

Können Sie erklären, was Sie nicht bekommen oder etwas falsch? –

+1

Ich weiß schon alles was du sagst. Und dies ist nicht anwendbar, da die App auf die SDK-Version 15 ausgerichtet ist und auch, weil das Problem nicht in der App enthalten ist. Das Problem liegt im Widget, das mit dem Widget-Container ausgeführt wird, der eine separate Anwendung ist. – lujop

+0

Können Sie erklären, wie Sie diese Aktivität im Widget erhalten? – user2548816

0

Haben Sie diese permisstion in Ihrer Manifest-Datei?

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
+1

Ich habe die WRITE_EXTERNAL_STORAGE, die nach den Dokumenten die READ-Datei gewährt. Aber das Problem ist nicht in der App, das Problem ist in dem WidgetContainer, der in einem anderen Prozess von OS ausgeführt wird. – lujop

2

@Docs sagt

Anfordern von Berechtigungen zur Laufzeit

in Android 6.0 Beginning (API-Ebene 23), Benutzer-Berechtigungen Apps gewähren, während die App ausgeführt wird, nicht, wenn sie installieren die App . Dieser Ansatz optimiert den App-Installationsprozess, da der Benutzer keine Berechtigungen erteilen muss, wenn er die App installiert oder aktualisiert.Es gibt dem Benutzer auch mehr Kontrolle über die Funktionalität der App.

daher das Sinn, obwohl Sie die Berechtigung in Manifest erklären aber noch immer die Erlaubnis verweigert

Ich schlage vor, Sie zu lesen, wie Runtime Erlaubnis

http://developer.android.com/training/permissions/requesting.html

Hier ist das Beispiel von Docs

zur Verfügung gestellt bekommen
if (ContextCompat.checkSelfPermission(thisActivity, 
      Manifest.permission.READ_CONTACTS) 
    != PackageManager.PERMISSION_GRANTED) { 

// Should we show an explanation? 
if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity, 
     Manifest.permission.READ_CONTACTS)) { 

    // Show an expanation to the user *asynchronously* -- don't block 
    // this thread waiting for the user's response! After the user 
    // sees the explanation, try again to request the permission. 

} else { 

    // No explanation needed, we can request the permission. 

    ActivityCompat.requestPermissions(thisActivity, 
      new String[]{Manifest.permission.READ_CONTACTS}, 
      MY_PERMISSIONS_REQUEST_READ_CONTACTS); 

    // MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE is an 
    // app-defined int constant. The callback method gets the 
    // result of the request. 
} 

}

Berechtigung ändern, wie pro Sie Anforderung

Hoffe, dass es Sie nach rechts Richtung führt

+1

Sehen Sie sich die Anmerkung 2 an. Laufzeitvorgaben werden nicht wirksam, wenn targetSDK <23 ist. – lujop

0

Wenn ich die targetSdkVersion-15 statt 23 eingestellt - werden die Android-M Nutzer die App sehen und in der Lage sein, um es herunterzuladen (Gewährung alle Berechtigungen zur Laufzeit)?

Ja, die App wird für M Benutzer verfügbar sein und jede Berechtigung wird bei der Installation gewährt.

`targetSdkVersion=15` 

, die weniger als 23.User ist in der Lage die App herunterladen und verwenden es gewährt die ganze Erlaubnis zur Laufzeit. Wenn Sie die Berechtigung überprüfen möchten, gehen Sie zu den Einstellungen und gewähren Sie die Berechtigung. Wenn Sie das Android M-Berechtigungsmodul zur Laufzeit verwenden möchten, müssen Sie die Ziel-SDK-Version auf 23 setzen. Wenn die auf Android M und höheren Geräten App abstürzt.

Wenn Sie für Android M Benutzer unterstützen möchten targetSdkVersion=23 und Erlaubnis Laufzeit Griff.