當您得到<untitled> download unsuccessful
時,通常意味着您的網址不正確或爲空或爲空。所以首先請確定url是可以的。
看看我的一個小例子,它運行在4.4(pre-lolipop)下的DownloadManager中。
import android.app.DownloadManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import java.io.File;
public class MainActivity extends AppCompatActivity {
private DownloadManager dm;
private String url;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
url = "https://collegereadiness.collegeboard.org/pdf/psat-nmsqt-practice-test-1.pdf";
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (TextUtils.isEmpty(url)) {
throw new IllegalArgumentException("url cannot be empty or null");
}
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
if (isExternalStorageWritable()) {
String uriString = v.getContext().getExternalFilesDir(null) + "";
File file = new File(uriString, Uri.parse(url).getLastPathSegment());
Uri destinationUri = Uri.fromFile(file);
request.setDestinationUri(destinationUri);
dm.enqueue(request);
}
}
});
registerReceiver(receiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
}
private BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) {
Log.d(TAG, "onReceive() returned: " + action);
// TODO: 2016-10-12
} else if (DownloadManager.ACTION_NOTIFICATION_CLICKED.equals(action)) {
Log.d(TAG, "onReceive() returned: " + action);
// TODO: 2016-10-12
}
}
};
private static final String TAG = "MainActivity";
//...
public boolean isExternalStorageWritable() {
String state = Environment.getExternalStorageState();
return Environment.MEDIA_MOUNTED.equals(state);
}
public boolean isExternalStorageReadable() {
String state = Environment.getExternalStorageState();
return Environment.MEDIA_MOUNTED.equals(state) ||
Environment.MEDIA_MOUNTED_READ_ONLY.equals(state);
}
}
它使用權限:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
它來處理所有的條件是很重要的。另外嘗試使用應用程序目錄,而不是在你的SD卡上搞亂。本示例將下載的文件保存在 /sdcard/Android/data/{your app package name}/files/
中。以前我檢查我是否已經安裝了SD卡,以及我是否可以在目錄上寫入。
樣品:
![enter image description here](https://i.stack.imgur.com/DCh25.gif)
好吧,這是我與解析的文件名,如果標題有「內容Disposition`場你說是你的服務器上,這樣您就可以樣品。做到這一點:)
import android.app.DownloadManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import java.io.File;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
public class MainActivity extends AppCompatActivity {
private DownloadManager dm;
private String url;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
url = "http://dl1.shatelland.com/files/07610a8d-a73f-45bb-8868-6fd33299bda7/6e33639f-0ce0-43ef-86e4-43492db1be86";
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(final View v) {
new Thread(new Runnable() {
@Override
public void run() {
downloadFileInTask(v.getContext(), url);
}
}).start();
}
});
registerReceiver(receiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
}
private void downloadFileInTask(Context v, String url) {
if (TextUtils.isEmpty(this.url)) {
throw new IllegalArgumentException("url cannot be empty or null");
}
/*when redirecting from hashed url and found headerField "Content-Disposition"*/
String resolvedFile = resolveFile(url, "unknown_file");
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
if (isExternalStorageWritable()) {
File file = new File(v.getExternalFilesDir(null), resolvedFile);
Uri destinationUri = Uri.fromFile(file);
request.setDestinationUri(destinationUri);
dm.enqueue(request);
}
}
private String resolveFile(String url, String defaultFileName) {
String filename = defaultFileName;
HttpURLConnection con = null;
try {
con = (HttpURLConnection) new URL(url).openConnection();
con.setInstanceFollowRedirects(true);
con.connect();
String contentDisposition = con.getHeaderField("Content-Disposition");
if (!TextUtils.isEmpty(contentDisposition)) {
String[] splittedCD = contentDisposition.split(";");
for (int i = 0; i < splittedCD.length; i++) {
if (splittedCD[i].trim().startsWith("filename=")) {
filename = splittedCD[i].replaceFirst("filename=", "").trim();
break;
}
}
}
con.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
return filename;
}
private BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) {
Log.d(TAG, "onReceive() returned: " + action);
// TODO: 2016-10-12
} else if (DownloadManager.ACTION_NOTIFICATION_CLICKED.equals(action)) {
Log.d(TAG, "onReceive() returned: " + action);
// TODO: 2016-10-12
}
}
};
private static final String TAG = "MainActivity";
//...
public boolean isExternalStorageWritable() {
String state = Environment.getExternalStorageState();
return Environment.MEDIA_MOUNTED.equals(state);
}
public boolean isExternalStorageReadable() {
String state = Environment.getExternalStorageState();
return Environment.MEDIA_MOUNTED.equals(state) ||
Environment.MEDIA_MOUNTED_READ_ONLY.equals(state);
}
}
其他文件類型在你的預棒棒糖正常工作? –
@KamranAhmed是... –
你能獲取下載管理器數據庫使用'adb root && adb pull /data/data/com.android.providers.downloads/databases/downloads.db .'? –