2

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%

enter image description here

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

enter image description here

[Bearbeiten]

Mein Ziel Speicherort ist: /storage/806E-1A11/Android/data/com.joshua.externalsddownloadtest/files/download/video.mp4

Quelle ist: http://downloads.4ksamples.com/downloads/[2160p]%204K-HD.Club-2013-Taipei%20101%20Fireworks%20Trailer%20(4ksamples.com).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; 
    } 
+1

"Datei destination = new File (destFolder, deskFileName)," lesen - Was ** genau ** ist der Wert von "Ziel"? – CommonsWare

+0

@CommonsWare, Ich habe "Ziel" Pfad hinzugefügt – jclova

+0

'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

Antwort

1

Ich denke, es geht um neue Berechtigungssystem an android 6. Sie sollten wie Berechtigungen in Runtime fragen:

if (ContextCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE) != getPackageManager().PERMISSION_GRANTED){ 
       ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, YOUR_CONST_REQUEST_CODE); 
      } 
    } 

Und implementieren Zuhörer

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

// invoke your download method 

        } else { 
// if permissions was not granted 
        } 

       } 
      } 
    } 

Andere Möglichkeit, wie Sie targetSdkVersion weniger als 23 in Gradle-Datei festlegen können.

Mehr über neue Berechtigungssystem können Sie hier Android.com

+0

Ich hätte erwähnen sollen, ich habe requestPermissions() & targetSdkVersion bereits weniger als 23 versucht. Es "friert" nur für 2 bis 3 Minuten ein, aber der Download funktioniert schließlich. Nichts mit der Erlaubnis zu tun. – jclova