我试图制作一个使用DownloadManager
下载iCal文件的应用程序。经过一番调查,我找不到解决我的问题。使用Android Studio调试器时,发现应用程序在查询请求时崩溃。在这里,我的错误中得到了Android监视器:当将请求排入DownloadManager时,应用程序崩溃
java.lang.SecurityException: Permission Denial: writing com.android.providers.downloads.DownloadProvider uri content://downloads/my_downloads from pid=5082, uid=10208 requires android.permission.INTERNET, or grantUriPermission()
我不明白为什么需要这已经给出android.permission.INTERNET
,下面我AndroidManifest所示:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="galisson.esiea.pst3.smartwatch">
<application
android:allowBackup="true"
android:icon="@drawable/smartwatch"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
</application>
这里是我的MainActivity
:
public class MainActivity extends AppCompatActivity {
EditText url;
Button buttonAdd;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
url = (EditText) findViewById(R.id.editTextLink);
buttonAdd = (Button) findViewById(R.id.buttonADD);
buttonAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(!url.getText().toString().isEmpty()) {
Uri iCalURI = Uri.parse(url.getText().toString());
DownloadData(iCalURI);
}
}
});
}
private void DownloadData(Uri p_uri) {
DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
DownloadManager.Request request = new DownloadManager.Request(p_uri);
request.setDescription("iCal Calendar downloading");
request.setTitle("iCal calendar");
request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI | DownloadManager.Request.NETWORK_MOBILE); //Restrict the types of networks over which this download may proceed.
request.setAllowedOverRoaming(false); //Set whether this download may proceed over a roaming connection.
request.allowScanningByMediaScanner();
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "iCal_tmp.ics");
manager.enqueue(request); //this is where it crashes
return;
}
}
是我的问题有权限或请求本身?
请编辑您的问题并发布整个清单,以防您将这些元素放在错误的地方。它也可能是一个错误,报告错误的错误,因为通常你需要保存'WRITE_EXTERNAL_STORAGE'来写入你正在寻找的目录,并且你没有任何运行时权限代码来向用户请求'WRITE_EXTERNAL_STORAGE'。 – CommonsWare
如果您正在测试棉花糖或牛轧糖应用程序,这很正常。您应该在“活动”中授予权限。 – JavadKhan
@CommonsWare我已经编辑了整个清单文章 –