2012-12-13 6 views
13

From here Ich kenne einen Weg, um eine Datei zu schreiben und für andere App und andere Absicht zugänglich zu sein, aber jetzt, da die Context.MODE_WORLD_READABLE veraltet ist, wie kann ich das sicher erreichen?Android: Alternative zum veralteten Context.MODE_WORLD_READABLE?

FileOutputStream out = myActivity.openFileOutput(fileTo, Context.MODE_WORLD_READABLE); 

Okay, mehr Infos:

Ich verwende diese:

intent = new Intent(Intent.ACTION_VIEW); 
intent.setDataAndType(uri, "video/*"); 

Und die uri wird derjenige, den ich auf eine SD-Karte Standort schreiben. Und das Video wird von der Anwendung kommen, so ist das Problem, wenn dies jetzt nicht erlaubt ist, wie kann ich die Datei schreiben und anzeigen.

Antwort

11

Und die uri wird derjenige, den ich auf eine SD-Karte Standort schreiben.

Das ist bereits standardmäßig MODE_WORLD_WRITABLE. Beachten Sie auch, dass der Code, den Sie aufgelistet haben (openFileOutput()), nicht in externen Speicher schreiben (was Sie fälschlicherweise "SDCard" nennen). openFileOutput() ist für internen Speicher.

Und das Video wird von der Anwendung kommen so Problem ist, wenn dies jetzt nicht erlaubt ist, wie kann ich die Datei schreiben und anzeigen.

Wenn Sie wirklich die Datei auf externen Speicher zu schreiben, benutzen Sie einfach eine Uri zeigen auf diese Datei.

Wenn Sie die Datei in den internen Speicher schreiben, erstellen Sie eine ContentProvider, um diese Datei zu liefern, und verwenden Sie eine Uri, die auf diese ContentProvider zeigt. Here is a sample application mit einer ContentProvider, die eine PDF-Datei von assets/ beim ersten Lauf extrahiert, dann dient diese Datei über openFile(), so dass es von einem PDF-Viewer angezeigt werden kann.

+0

Danke. Das trifft die Stelle. : D – Marl

+1

Wenn eine Videodatei als Datei im internen Speicher gespeichert wurde (unter Verwendung der durch 'getCacheDir' angegebenen Stelle), sagst du, dass der ContentProvider irgendwie einen URI zu einem VideoView liefern könnte, der dann spielbar ist? Weil die direkte URI zu dem intern gespeicherten Video nicht funktioniert (ich denke, eine Videodatei muss für eine Videoansicht in der Welt lesbar sein, ist aber im internen internen Cache der Anwendung nicht lesbar). –

+0

@DanielSmith: "Willst du sagen, dass der ContentProvider irgendwie einen URI zu einem VideoView liefern könnte, der dann spielbar ist?" - Video ist knifflig, weil der Spieler normalerweise einen suchbaren Stream (vorwärts und rückwärts) und einen Stream benötigt veröffentlicht von einem 'ContentProvider' ist nicht suchbar. Mir sind keine Videoformate bekannt, die mit einem Vorwärts-Stream abgespielt werden können, obwohl ich diesen Punkt nicht untersucht habe. – CommonsWare

3

Es sieht so aus, als ob die Docs sich darüber im Klaren sind.

Diese Konstante wurde in API-Ebene veraltet 17.

Erstellen Welt lesbare Dateien sehr gefährlich ist, und wahrscheinlich Sicherheitslücken in Anwendungen verursachen. Es wird dringend abgeraten; Stattdessen sollten Anwendungen formelleren Mechanismus für Interaktionen wie ContentProvider, BroadcastReceiver und Service verwenden. Es gibt keine Garantien, dass dieser Zugriffsmodus in einer Datei bleiben wird, wie wenn es eine Sicherung und Wiederherstellung durchläuft. Dateierstellungsmodus: Erlaubt allen anderen Anwendungen Lesezugriff auf die erstellte Datei.

+0

hinzugefügt mehr Details zu meiner Frage .. – Marl

7

in Ihrem internen Speicher Speichern Sie Ihre Videos mit:

openFileOutput("test.mp4", "MODE_PRIVATE"); 

Dann tun:

String path = context.getFilesDir().getAbsolutePath() + "/test.mp4"; // path to the root of internal memory. 
File f = new File(path); 
f.setReadable(true, false); 
Intent playIntent .... 
playIntent.setType("video/*"); 
playIntent.setData(Uri.fromFile(f)); 

Good Luck.

+0

Danke, das hat mir geholfen, wollte nicht SDcard für eine temporäre Datei verwenden, beachten Sie, dass dies Api 9 oder höher ist, so endete mit modus_world_readable für Api 8, und dies für 9 und höher. –

+0

natürlich die beste Wahl ist ContentProvider, in einigen Fällen wird dies nicht funktionieren. Zum Beispiel können Spieler nicht auf die SRT-Dateien zugreifen, die am selben Ort der Videodatei gespeichert sind, und denselben Namen verwenden, selbst wenn wir für die SRT-Dateien Readable setzen. – hasan83

+0

@ hasan83 wenn ich eine Datei schreibe mit FileOutputStream zu Daten/Daten/com. ***. ***/MeinFolder, es mir nicht erlaubt, die Datei wie oben beschrieben zu lesen? – NitZRobotKoder