Android - Unable to open content: file:///storage/emulated/0
Habe ich ein widget mit neun-patch-Bild-hintergrund.
Das abbild wurde gespeichert in /sdcard/mydir/bgs.
Wenn ich versuche zu laden, ein Bild mit setImageViewUri Methode, ich habe diesen Fehler:
Unable to open content: file:///storage/emulated/0/sdcard/mydir/bgs
..
dann
...
open failed: EACCES (Permission denied)
Dieser erscheint nur auf der Startseite und nur mit dem Nexus 10 und Nexus 7 (mit den neuesten launcher von 4.4 dieser bug nicht vorhanden). Ich habe auch einige RemoteViews auf meine Bewerbung und alles korrekt funktioniert.
Außerdem habe ich in manifest-entweder READ_EXTERNAL_STORAGE, entweder WRITE_EXTERNAL_STORAGE.
Wie kann ich das Problem lösen?
UPDATE: ich habe untersuchen der Methode setImageViewUri und ich habe festgestellt, dass es ändert den Pfad meiner Datei.
if (value != null) {
//Resolve any filesystem path before sending remotely
value = value.getCanonicalUri();
if (StrictMode.vmFileUriExposureEnabled()) {
value.checkFileUriExposed("RemoteViews.setUri()");
}
}
Dieser Methode erhalten meine Wert (/sdcard/mydir/bgs) und ändert es in (storage/emulated/0/sdcard/mydir/bgs). Aber diese Datei nicht vorhanden ist in das system über adb.
InformationsquelleAutor der Frage CeccoCQ | 2013-12-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Scheint es
setImageViewUri
ist nicht mehr sicher für die Verwendung mit file://uris.Warum?
Jellybean eingeführt, die
READ_EXTERNAL_STORAGE
Berechtigung. Apps, die das Lesen wollen von einem externen Speicher müssen im Besitz dieser Erlaubnis. Dies war nicht standardmäßig erzwungen, bis KitKat.Der launcher nicht im Besitz dieser Erlaubnis. In der Tat sind Sie nicht garantiert, dass jeder RemoteView Räumen Sie hält, der Erlaubnis. Das macht es unsicher, zu verwenden setImageViewUri, da Sie nicht wissen, wenn das remote-image-anzeigen werden auch in der Lage sein zu Lesen der angegebenen uri.
Was nun?
Option 1: Verwenden der setImageViewBitmap.
Können Sie verschoben haben, Weg von dieser option aufgrund fehlerhafter binder Transaktionen. Der trick, um diejenigen, die nur macht Sie sicher, Ihr Bild ist unter 1 MB. Dies ist nicht so schwer wie es klingt. Sie können genau kalkulieren, wie groß dein Bild sein wird. Zum Beispiel, wenn Sie mit einem ARGB_8888 Bild, das heißt, Sie müssen 4 bytes pro pixel. Wir können calulate die max Größe von:
Natürlich können Sie squeeze mehr aus es mit RGB_565 zu bekommen 2x die Pixel.
Beachten Sie auch, dass Sie nicht unbedingt ein riesiges Bild, wenn Ihr widget ist klein. Ihre appwidget können Fragen über seine spezifischen Möglichkeiten, die durch die folgenden:
Nur bewusst sein, dass die zurückgegebenen Werte sind in der dip nicht auf Pixel, so dass Sie brauchen, um zu konvertieren, skalieren von bitmap.
Option 2: Verwenden Sie ein content-provider
Wenn Sie aus irgendeinem Grund immer noch nicht, wie die IPC-Einschränkung können Sie immer bauen einen benutzerdefinierten content-provider. Passieren, dass uri in der setImageViewUri, und Sie sollten gut zu gehen.
Was über den Weg wechseln?
Den Pfad wechseln, ist nicht das wirkliche Problem. Wie es aussieht ist es ein problem, aber die emulation funktioniert tatsächlich gut. Versuchen Sie, erstellen eine Datei im
//storage/emulated/0/sdcard/mydir/bgs
und die Datei wird schaffen just fine.Werden Sie feststellen, dass, während die Ausnahme ist eine FileNotFoundException die Meldung Permission Denied.
InformationsquelleAutor der Antwort Grimmace
Als von Lollipop, Google stellte eine neue Art, ausdrücklich gewährt apps die Berechtigung, die Sie verwenden möchten auf Ihrem Gerät, und deaktivieren diejenigen, die Sie verweigern möchten die app. Wenn Sie feststellen, in Ihrem android-monitor, zeigt das Protokoll
EACCESS permission denied
ist die Ursache der java-berüchtigtenFileNotFoundException
.Um dieses Problem zu lösen, nur springen Ihre App-Berechtigungen, und aktivieren Sie Speicher für Ihre app
InformationsquelleAutor der Antwort toniton
Müssen Sie
in Ihrem manifest.
InformationsquelleAutor der Antwort Kuffs
Ich denke, Sie sind der Eingabe von SD-Karte Pfad manuell. Anstelle der manuellen Eingabe von SD-Karte Weg, sollte man eine Speicher-Pfad wie in diesem Beispiel :
InformationsquelleAutor der Antwort Vipul Purohit