Download in den internen Speicher funktioniert.Download auf externen Speicher mit DownloadManager funktioniert nicht ordnungsgemäß auf Galaxy S7
Wenn ich jedoch versuche, auf die externe SD-Karte herunterladen, wird der Status erst nach 2 ~ 3 Minuten aktualisiert. (Das heißt, ich bekomme 0 Bytes von cursor.getLong heruntergeladen (Cursor .getColumnIndex (DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));). Es wird schließlich nach 2 ~ 3 Minuten heruntergeladen.
Der Benachrichtigungsstatus sagt auch 0%
private void addToDownloadManager(String sourcePath, String destFolder, String deskFileName, DownloadManager downloadManager) {
try {
if(sourcePath == null || sourcePath.equals(""))
return;
try {
File folder = new File(destFolder);
if (!folder.exists()) {
folder.mkdirs();
}
}catch (Exception e) {
}
Uri Download_Uri = Uri.parse(sourcePath);
DownloadManager.Request request = new DownloadManager.Request(Download_Uri);
request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI);
request.setAllowedOverRoaming(false);
request.setTitle("title");
request.setDescription("description");
File destination = new File(destFolder, deskFileName);
request.setDestinationUri(Uri.fromFile(destination));
downloadReference = downloadManager.enqueue(request);
} catch (Exception e) {
}
}
private Timer mDownloadStatusTimer;
public void downloadStatusTimerSchedule() {
if (mDownloadStatusTimer != null)
downloadStatusTimerCancel();
try {
mDownloadStatusTimer = new Timer("DownloadStatusTimer");
DownloadStatusTimer timer = new DownloadStatusTimer();
mDownloadStatusTimer.schedule(timer, 500, 500); // 0.5 second
} catch (Exception e) {
}
}
public void downloadStatusTimerCancel() {
if (mDownloadStatusTimer != null) {
mDownloadStatusTimer.cancel();
mDownloadStatusTimer.purge();
mDownloadStatusTimer = null;
}
}
private long bytes_downloaded = 0;
private long bytes_total = 0;
public class DownloadStatusTimer extends TimerTask {
@Override
public void run() {
if (mDownloadManager != null) {
DownloadManager.Query myDownloadQuery = new DownloadManager.Query();
Cursor cursor = mDownloadManager.query(myDownloadQuery);
bytes_downloaded = 0;
bytes_total = 0;
try {
if (cursor != null && cursor.moveToFirst()) {
try {
// Get downloaded size/total size
if (cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)) == DownloadManager.STATUS_SUCCESSFUL ||
cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)) == DownloadManager.STATUS_FAILED) {
// do nothing
} else {
bytes_downloaded += cursor.getLong(cursor
.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));
bytes_total += cursor.getLong(cursor.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));
}
} catch (Exception e) {
}
while (cursor != null && cursor.moveToNext()) {
try {
// Get downloaded size/total size
if (cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)) == DownloadManager.STATUS_SUCCESSFUL ||
cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)) == DownloadManager.STATUS_FAILED) {
// do nothing
} else {
bytes_downloaded += cursor.getLong(cursor
.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));
bytes_total += cursor.getLong(cursor.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));
}
} catch (Exception e) {
}
}
} else {
}
} catch (Exception e) {
} finally {
if (cursor != null) {
cursor.close();
}
}
Log.e("test", "Download size: " + bytes_downloaded + "/" + bytes_total);
MainActivity.this.runOnUiThread(new Runnable() {
public void run() {
try {
tv_download_status.setText("Download size: " + bytes_downloaded + "/" + bytes_total);
} catch (Exception e) {
}
}
});
}
}
}
I getestet Anmerkung 4 und Galaxy S5 und sie scheint in Ordnung zu sein.
Könnte es Android 6.0 Sache sein? oder S7? Ist es ein Fehler? Oder gibt es irgendetwas, was ich hier falsch mache?
Wenn Sie es selbst testen möchten, hier ist das Projekt mit Quellcode: https://drive.google.com/open?id=0BygTefPD845LTkp5QU1mOHRkMDQ
Hier APK ist zu testen: https://drive.google.com/open?id=0By...Ec1ZHk5ZWRkWWc
[Bearbeiten]
Mein Ziel Speicherort ist: /storage/806E-1A11/Android/data/com.joshua.externalsddownloadtest/files/download/video.mp4
(I die URL aus der Mp4 Beispiel Website bekam)
File[] files = ContextCompat.getExternalFilesDirs(MainActivity.this, null);
destFolder = null;
for(int i=0; i< files.length; i++) {
if (!files[i].getAbsolutePath().equals(MainActivity.this.getExternalFilesDir(null).getPath())) {
destFolder = files[i].getAbsolutePath();
break;
}
}
boolean bDownloadToExternal = false;
if(destFolder == null) {
tv_download_destination.setText("No external storage found");
} else {
destFolder += "/download/";
tv_download_destination.setText("Destination location: " + destFolder + fileName);
bDownloadToExternal = true;
}
"Datei destination = new File (destFolder, deskFileName)," lesen - Was ** genau ** ist der Wert von "Ziel"? – CommonsWare
@CommonsWare, Ich habe "Ziel" Pfad hinzugefügt – jclova
'DownloadManager' hat möglicherweise keinen Zugriff auf beliebige Punkte auf [Wechselspeicher] (https://commonsware.com/blog/2014/04/09/storage-situation-removable- storage.html) auf Android 4.4 und höher. Gewöhnliche Apps nicht. – CommonsWare