下载管理器Android权限错误:写入外部存储
我编写了一个Android应用程序,使用DownloadManager将一个示例PDF文件下载到下载目录。代码如下:下载管理器Android权限错误:写入外部存储,android,xml,android-manifest,android-permissions,android-download-manager,Android,Xml,Android Manifest,Android Permissions,Android Download Manager,我编写了一个Android应用程序,使用DownloadManager将一个示例PDF文件下载到下载目录。代码如下: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_vertretungsplan); Button dlbutton = (Button) fi
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_vertretungsplan);
Button dlbutton = (Button) findViewById(R.id.buttondownload);
final Context c = this;
dlbutton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(myurl));
request.setTitle("Vertretungsplan");
request.setDescription("wird heruntergeladen");
request.allowScanningByMediaScanner();
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
String filename = URLUtil.guessFileName(myurl, null, MimeTypeMap.getFileExtensionFromUrl(myurl));
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, filename);
DownloadManager manager = (DownloadManager) c.getSystemService(Context.DOWNLOAD_SERVICE);
manager.enqueue(request);
}
});
}
现在,我尝试在我的Xperia Z3 Android 6.0上从Android Studio调试运行它。
当我单击下载按钮时,出现以下错误:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.markwitt.schul_app, PID: 29297
java.lang.SecurityException: No permission to write to /storage/emulated/0/Download/hrpsampletable.pdf: Neither user 10047 nor current process has android.permission.WRITE_EXTERNAL_STORAGE.
at android.os.Parcel.readException(Parcel.java:1627)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:183)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135)
at android.content.ContentProviderProxy.insert(ContentProviderNative.java:476)
at android.content.ContentResolver.insert(ContentResolver.java:1240)
at android.app.DownloadManager.enqueue(DownloadManager.java:946)
at com.example.markwitt.schul_app.Vertretungsplan$1.onClick(Vertretungsplan.java:59)
at android.view.View.performClick(View.java:5280)
at android.view.View$PerformClick.run(View.java:21239)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:224)
at android.app.ActivityThread.main(ActivityThread.java:5526)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
已断开与目标VM的连接,地址:'localhost:8600',传输:'socket'
(在第三行)它向我显示它对外部存储没有写权限
但我的AndroidManifest设置正确:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.markwitt.schul_app">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<application
android:launchMode="singleTop"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".Stundenplan">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".Vertretungsplan"></activity>
</application>
我需要做什么?
您收到此错误是因为您的应用程序运行在Android 6.0(API级别23)中。从API级别>=23开始,您需要在运行时检查权限。你的代码在23级以下就可以了。因此,请首先检查您的用户是否已授予使用存储的权限:
if(checkSelfPermission(android.Manifest.permission.WRITE\u EXTERNAL\u STORAGE)==PackageManager.permission\u provided){
Log.e(“权限错误”,“您有权限”);
返回true;
}
如果没有,则提示请求:
ActivityCompat.requestPermissions(这个新字符串[]{Manifest.permission.WRITE\u EXTERNAL\u STORAGE},请求\u代码);
总体情况如下:
public boolean haveStoragePermission(){
如果(Build.VERSION.SDK_INT>=23){
if(checkSelfPermission(android.Manifest.permission.WRITE\u外部存储)
==PackageManager.权限(已授予){
Log.e(“权限错误”,“您有权限”);
返回true;
}否则{
Log.e(“权限错误”,“您已请求权限”);
ActivityCompat.requestPermissions(这个新字符串[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
返回false;
}
}
否则{//您不必担心api级别23以下的内容
Log.e(“权限错误”,“您已经拥有权限”);
返回true;
}
}
最后一件事:)
通过回调接收结果:
@覆盖
public void onRequestPermissionsResult(int-requestCode、字符串[]权限、int[]grantResults){
super.onRequestPermissionsResult(请求代码、权限、授权结果);
if(grantResults[0]==已授予PackageManager.权限){
//你现在有权限了。
DownloadManager.Request=newdownloadmanager.Request(Uri.parse(myurl));
请求。设置标题(“Vertretungsplan”);
请求。设置描述(“wird HERUNTERGELOAD”);
request.allowScanningByMediaScanner();
request.setNotificationVisibility(DownloadManager.request.VISIBILITY\u VISIBLE\u NOTIFY\u完成);
String filename=URLUtil.guessFileName(myurl,null,MimeTypeMap.getFileExtensionFromUrl(myurl));
request.setDestinationNexternalPublicDir(Environment.DIRECTORY\u下载,文件名);
DownloadManager=(DownloadManager)c.getSystemService(Context.DOWNLOAD\u服务);
排队(请求);
}
}
或者,您可以使用我的自定义类
PermissionCheck
非常轻松地处理所有这些实现。下面是课堂:
导入android.Manifest;
导入android.app.Activity;
导入android.content.Context;
导入android.content.pm.PackageManager;
导入android.support.v4.app.ActivityCompat;
/**
*由Tushar于2017年6月30日创建。
*/
公共类许可证检查{
公共静态布尔读写外部存储(上下文){
if(ActivityCompat.checkSelfPermission(context,Manifest.permission.READ_EXTERNAL_STORAGE)!=PackageManager.permission_已授予| | ActivityCompat.checkSelfPermission(context,Manifest.permission.WRITE_EXTERNAL_STORAGE)!=PackageManager.permission_已授予){
ActivityCompat.requestPermissions((活动)上下文,新字符串[]{Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE},1);
返回false;
}否则{
返回true;
}
}
公共静态布尔音频记录(上下文){
if(ActivityCompat.checkSelfPermission(context,Manifest.permission.RECORD_AUDIO)!=PackageManager.permission_provided){
ActivityCompat.requestPermissions((活动)上下文,新字符串[]{Manifest.permission.RECORD_AUDIO},2);
返回false;
}否则{
返回true;
}
}
公共静态布尔读写触点(上下文){
if(ActivityCompat.checkSelfPermission(context,Manifest.permission.READ_CONTACTS)!=PackageManager.permission|u已授予| ActivityCompat.checkSelfPermission(context,Manifest.permission.WRITE_CONTACTS)!=PackageManager.permission_已授予){
ActivityCompat.requestPermissions((活动)上下文,新字符串[]{Manifest.permission.READ_CONTACTS,Manifest.permission.WRITE_CONTACTS},3);
返回false;
}否则{
返回true;
}
}
公共静态布尔振动(上下文){
if(ActivityCompat.checkSelfPermission(context,Manifest.permission.VIBRATE)!=PackageManager.permission\u已授予){
ActivityCompat.requestPermissions((活动)上下文,新字符串[]{Manifest.permission.VIMBER},4);
返回false;
}否则{
返回true;
}
}
公共静态布尔sendSms(上下文){
if(ActivityCompat.checkSelfPermission(context,Manifest.permission.SEND_SMS)!=PackageManager.permission_provided){
ActivityCompat.requestPermissions((活动)上下文,新字符串[]{Manifest.permission.SEND_SMS},5);
返回false;
}否则{
返回true;
}
}
//就像这样,您可以实现其余的权限。
}
用法:
if(Perm)
private static int REQUEST_CODE=1;
ActivityCompat.requestPermissions(this, new String[]{
Manifest.permission.WRITE_EXTERNAL_STORAGE
}, REQUEST_CODE);
if(ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED || ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
// this will request for permission when permission is not true
}else{
// Download code here
}