Wie Sie programmgesteuert verschieben , kopieren von Dateien auf SD?
Mache ich eine android app, die ermöglicht dem Benutzer, übertragen Sie Dateien vom internen Speicher auf externe Speichermedien(SD-Karte) mit SAF.
Dies ist, wie ich Sie nennen Absicht, damit der Benutzer wählen Sie die SD-Karte-Verzeichnis.
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
startActivityForResult(intent, 42);
Und das ist mein onActivityResult
public void onActivityResult(int requestCode, int resultCode, Intent data) {
treeUri = data.getData();
final int takeFlags = data.getFlags()
& (Intent.FLAG_GRANT_READ_URI_PERMISSION
| Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
getActivity().getContentResolver().takePersistableUriPermission(treeUri, takeFlags);
}
Nehme ich die Erlaubnis für die gesamte SD-Karte, so dass ich verschieben Sie oder löschen Sie jede Datei in sd-Karte jeder Zeit .Das problem ist, dass selbst nach der Einnahme Erlaubnis ich bin nicht in der Lage zu verschieben oder zu löschen, eine Datei in SD-Karte.
Wie soll ich eine Datei verschieben vom internen Speicher auf den externen(SD-Karte) für android 5.0 und oben.
EDIT:Dies ist der code, den ich benutze, um Dateien zu verschieben.
public static void MoveFiles(File src, File dst) throws IOException
{
FileChannel inChannel = new FileInputStream(src).getChannel();
FileChannel outChannel = new FileOutputStream(dst).getChannel();
try
{
inChannel.transferTo(0, inChannel.size(), outChannel);
}
finally
{
if (inChannel != null)
inChannel.close();
if (outChannel != null)
outChannel.close();
src.delete();
}
}
- "Das problem ist, dass selbst nach der Einnahme Erlaubnis ich bin nicht in der Lage zu verschieben oder zu löschen, eine Datei in SD-Karte" -- haben Sie Sie nicht gezeigt-code für "verschieben oder löschen Sie eine Datei in SD-Karte", und Sie haben nicht erklärt, was das eigentliche problem ist (z.B., Java-stack-trace).
- Sie haben natürlich diese Berechtigungen Hinzugefügt, in der manifestfile?
- ich habe bearbeitet Sie meine Frage.
- ich habe lese-und Schreibzugriff externe Speicher Genehmigung in meinem manifest.
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
. Aussage macht keinen Sinn. Besser entfernen Sie es.- Danke werde es entfernen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist, wie ich endlich das Problem gelöst.
Ersten Aufruf eine Absicht, damit der Benutzer mit Schreibberechtigungen für die gesamte SD-Karte.
Dann auf onActivityResult nehmen Schreibberechtigung.
- Und dies ist der code, den ich verwendet, um Dateien zu kopieren auf SD-Karte.
Der obige code verwendet die folgenden zwei Methoden.
getDocumentFileIfAllowedToWrite Methode gibt DocumentFile-wenn erlaubt ist zu schreiben.
- Und mime-Methode liefert den mime-Typ der Datei.
Ich getestet habe den obigen code mit Android Lollipop und Marshmallow.
EDIT: hier ist der link zu der FileUtils Klasse.
Nein, das sind Sie nicht. Du nimmst die Erlaubnis für beliebige Dokument-Baum der Benutzer wählt, um in der Lage sein, mit zu arbeiten , dass Dokument-Baum, mit dem Storage Access Framework-APIs (z.B.
DocumentFile
).Ist, weil Sie versuchen, die Arbeit mit dem Dateisystem-APIs. Sie haben keine Rechte, um die Arbeit mit den Wechselmedien, die über diejenigen APIs, die außerhalb der spezifischen Gebieten, die für den Zugriff durch die app (z.B.
getExternalFilesDirs()
).Wenn Sie wollen, um die Arbeit mit dem Dokument-Baum:
Verwenden Sie
DocumentFile.fromTreeUri()
zu erstellenDocumentFile
zeigt auf die Wurzel des BaumesMethoden auf, die
DocumentFile
um zu sehen, was ist, die Ebene des Baumes, erhaltenDocumentFile
Objekte auf den Zweigen des Baumes, erhaltenDocumentFile
Objekte auf Inhalte in diesem Baum, etc.DocumentFile
Methoden, wiecreateFile()
zu bekommenDocumentFile
für die, wo im Dokument-Baum, den Sie hinzufügen möchten einige Inhalte. Rufen SiegetUri()
auf, dassDocumentFile
, dann pass aufopenOutputStream()
auf eineContentResolver
. Von dort aus, verwenden Sie ein standard-Java I/O (z.B. öffnen einerFileInputStream
auf der Quell-Datei und kopieren Sie dann die bytes von derInputStream
zu denOutputStream
).ACTION_OPEN_DOCUMENT_TREE
zu ermöglichen, der Benutzer wählen Sie den Speicherort, wo Sie sollte content. Wenn Sie möchten, erstellen Sie Ihre eigene Teilbäume unter diesem Benutzer-gewählten Speicherort befinden, verwenden SiecreateDirectory()
aufDocumentFile
.ACTION_OPEN_DOCUMENT_TREE
.Uri.fromFile()
zu bekommenUri
zeigt auf einFile
. Ich bezweifle, dass diese für Sie nützlich sind.