我一直在使用DownloadManager API在一个应用程序中处理下载大约3年.最近我在Android Pie上有一些用户抱怨有时下载会在实际启动之前停留几分钟,从而影响用户体验:他们中的一些人不得不重新安装应用程序以使其正常工作,其他一些用户随着时间的推移自行修复问题.请注意,我没有设置任何特殊设置的DownloadManager.Request实例(例如allowedNetworkTypes,setRequiresCharging...).
我对这个问题的理解是,在开始之前,请求会长时间陷入挂起或暂停状态.没有注意到SDK 28中引入的任何重大更改,尽管它并不重要,因为我的目标是API级别27.
有没有人经历过类似的事情并提出了一些解决方法?谢谢
我正在使用下载管理器从互联网下载文件。下载已在Android 6、8.1中成功完成,但在Android 9.0中未成功完成
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
request.setDescription("Downloading...");
request.setTitle(nameOfFile);
request.setMimeType("application/pdf");
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS + "/CPG", nameOfFile);
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
queueId = manager.enqueue(request);
Run Code Online (Sandbox Code Playgroud) 我正在尝试连接到这些地方之一并获取JSON数据:-
https://content.guardianapis.com/search?q=debate&tag=politics/politics&from-date=2014-01-01&api-key=test
https://content.guardianapis.com/search?q=debates&api-key=test
https://content.guardianapis.com/search?api-key=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx
Run Code Online (Sandbox Code Playgroud)
我可以通过浏览器访问所有这三个,但是当我尝试通过Android应用访问它们时,出现以下错误:
NetworkSecurityConfig: No Network Security Config specified, using platform default
Error response code: 400
Run Code Online (Sandbox Code Playgroud)
我已将此添加到manifest.xml:-
<uses-permission android:name="android.permission.INTERNET"/>
Run Code Online (Sandbox Code Playgroud)
我还将此添加到manifest.xml:
android:networkSecurityConfig="@xml/network_security_config"
Run Code Online (Sandbox Code Playgroud)
并创建了res / xml / network_security_config.xml,其中包含:-
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config>
<domain includeSubdomains="true">content.guardianapis.com</domain>>
</domain-config>
Run Code Online (Sandbox Code Playgroud)
将错误更改为:
D/NetworkSecurityConfig: Using Network Security Config from resource network_security_config debugBuild: true
Error response code: 400
Run Code Online (Sandbox Code Playgroud)
我知道它不见了:
<trust-anchors>
<certificates src="@raw/my_ca"/>
</trust-anchors>
Run Code Online (Sandbox Code Playgroud)
但我不知道证书在哪里或在什么地方,是否需要它。
不太确定发生了什么,将不胜感激。
另外:-我可以很好地连接并从此URL获取JSON:-
https://earthquake.usgs.gov/fdsnws/event/1/query?format=geojson&eventtype=earthquake&orderby=time&minmag=6&limit=10
Run Code Online (Sandbox Code Playgroud)
我所得到的是:
No Network Security Config specified, using platform default
Run Code Online (Sandbox Code Playgroud)
购买不是错误400,而是获得200。因此,这让我觉得有些奇怪的事情正在发生,但不确定在哪里。
我正在研究一个Android应用,该应用使用WiFi连接到本地Flask服务器。然后,该应用程序显示存储在服务器(RPi3)上的图像。单击图像会触发下载请求,我希望Android DownloadManager将请求加入队列并下载图像。 WiFi网络不提供互联网访问。
到目前为止,我已经能够在Android 6和Android 8.1设备上对其进行测试,并且一切正常。在多个Android 9设备上进行测试后,下载未开始,但是从本地网络断开连接后,将显示失败的尝试。
阅读有关此内容的其他主题,我尝试了以下方法:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>
Run Code Online (Sandbox Code Playgroud)
并添加在AndroidManifest.xml中:
android:networkSecurityConfig="@xml/network_security_config"
Run Code Online (Sandbox Code Playgroud)
如此处第一个答案所述,绑定网络:在 没有Internet连接的情况下使用WiFi
使用DownloadManager.Request类提供的选项,但它们似乎与此问题无关:
.setRequiresCharging(false)
.setAllowedOverMetered(false)
.setAllowedOverRoaming(false)
.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, (String) url);
Run Code Online (Sandbox Code Playgroud)
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
Run Code Online (Sandbox Code Playgroud)
这是我创建的下载请求:
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url))
.setTitle("Some Title") …Run Code Online (Sandbox Code Playgroud) 我一直在生产应用程序中使用DownloadManager,没有问题,但是现在在Android Pie(API 28)中失败。请注意,下载被标记为失败并返回错误400。
@Override
public void onReceive(Context context, Intent intent) {
long reference = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);
DownloadManager.Query query = new DownloadManager.Query();
query.setFilterById(reference);
DownloadManager downloadManager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
Cursor cursor = downloadManager.query(query);
cursor.moveToFirst();
int statusIndex = cursor.getColumnIndex(DownloadManager.COLUMN_STATUS);
int status = cursor.getInt(statusIndex);
if (status == DownloadManager.STATUS_SUCCESSFUL) {
int fileUriIndex = cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI);
String savedFileUri = cursor.getString(fileUriIndex);
ParcelFileDescriptor pfd = null;
try {
pfd = context.getContentResolver().openFileDescriptor(Uri.parse(savedFileUri), "r");
PamplonaParkingXMLParser pamplonaParkingXMLParser = new PamplonaParkingXMLParser();
ParkingList parkingList = pamplonaParkingXMLParser.parse(pfd);
ObservableObject.getInstance().updateValue(parkingList);
if (pfd != null) {
pfd.close();
} …Run Code Online (Sandbox Code Playgroud)