Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/182.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
下载管理器Android权限错误:写入外部存储_Android_Xml_Android Manifest_Android Permissions_Android Download Manager - Fatal编程技术网

下载管理器Android权限错误:写入外部存储

下载管理器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

我编写了一个Android应用程序,使用DownloadManager将一个示例PDF文件下载到下载目录。代码如下:

@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
        }