我添加了写入清单文件的外部存储权限,尽管logcat没有写入权限。如何解决它

时间:2016-03-05 11:47:04

标签: android

这是我的Logcat消息

                                             java.lang.SecurityException: No permission to write to /storage/0F0D-0A0C/Download/notice.php: Neither user 10082 nor current process has android.permission.WRITE_EXTERNAL_STORAGE.

我正在尝试从外部存储器下载文件,我给出了文件的路径,我的下载文件代码是

TextView downloadlink = (TextView)findViewById(R.id.downloadlink);
    downloadlink.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String myHTTPUrl = "http://192.168.122.1/notice.php";
            DownloadManager.Request request = new DownloadManager.Request(Uri.parse(myHTTPUrl));
            request.setTitle("File download");
            request.setDescription("File is being downloaded...");
            request.allowScanningByMediaScanner();
            request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
            String nameOfFile = URLUtil.guessFileName(myHTTPUrl,null, MimeTypeMap.getFileExtensionFromUrl(myHTTPUrl));
            request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, nameOfFile);
            DownloadManager manager = (DownloadManager)getSystemService(Context.DOWNLOAD_SERVICE);
            manager.enqueue(request);
        }
    });

清单文件权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET"/>

1 个答案:

答案 0 :(得分:1)

请检查您的应用当前是否在MarshMallow或更高版本中运行,然后需要检查运行时的危险权限。请将其包含在MainActivity中。你可以从任何地方打电话。

public static final int MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE = 1;

public boolean checkPermission()
{
    int currentAPIVersion = Build.VERSION.SDK_INT;
    if(currentAPIVersion>=android.os.Build.VERSION_CODES.M)
    {
        if (ContextCompat.checkSelfPermission(context, android.Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            if (ActivityCompat.shouldShowRequestPermissionRationale((Activity) context, android.Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                android.support.v7.app.AlertDialog.Builder alertBuilder = new android.support.v7.app.AlertDialog.Builder(this);
                alertBuilder.setCancelable(true);
                alertBuilder.setTitle("Permission necessary");
                alertBuilder.setMessage("To download a file it is necessary to allow required permission");
                alertBuilder.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
                    @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
                    public void onClick(DialogInterface dialog, int which) {
                        ActivityCompat.requestPermissions((Activity)context, new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE);
                    }
                });
                android.support.v7.app.AlertDialog alert = alertBuilder.create();
                alert.show();
            } else {
                ActivityCompat.requestPermissions((Activity)context, new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE);
            }
            return false;
        } else {
            return true;
        }
    } else {
        return true;
    }
}

此处检查权限是否已经授予,如果app当前正在marshmallow或更高版本中运行,请将其检查为。在这里,我改变了你的代码。

TextView downloadlink = (TextView)findViewById(R.id.downloadlink);
downloadlink.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        if(checkPermission()){

          downloadFile();
        }  
    }
});

将您的下载代码放入

方法中
downloadFile(){
    String myHTTPUrl = "http://192.168.122.1/notice.php";
        DownloadManager.Request request = new DownloadManager.Request(Uri.parse(myHTTPUrl));
        request.setTitle("File download");
        request.setDescription("File is being downloaded...");
        request.allowScanningByMediaScanner();
        request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
        String nameOfFile = URLUtil.guessFileName(myHTTPUrl,null, MimeTypeMap.getFileExtensionFromUrl(myHTTPUrl));
        request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, nameOfFile);
        DownloadManager manager = (DownloadManager)getSystemService(Context.DOWNLOAD_SERVICE);
        manager.enqueue(request);
}

如果已经授予权限,则下载代码将起作用,否则它将调用覆盖方法'onRequestPermissionsResult()'

下面给出覆盖方法

 @Override
 public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE:
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                downloadFile();
            } else {
                //code for deny
            }
            break;
    }
}

请尝试这个,然后就可以了

相关问题