webapp安卓8.1/9.0版本下载app直接卡死,小白求大神指点

叫我梁大侠 2020-05-25 08:37:18
我这网上抄了个监听webview下载的代码,在安卓10.0+是没问题的,可是8.1和9.0的就不行:

webView.setDownloadListener(new DownloadListener() {

public void onDownloadStart(String url, String userAgent,
String contentDisposition, String mimetype,
long contentLength) {
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
request.allowScanningByMediaScanner();
request.setTitle("测试");
request.setDescription("下载中..");
String fileName = URLUtil.guessFileName(url, contentDisposition, mimetype);
request.setNotificationVisibility(
DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
request.setDestinationInExternalPublicDir(
Environment.DIRECTORY_DOWNLOADS,
fileName);

DownloadManager dm = (DownloadManager) getSystemService(
DOWNLOAD_SERVICE);
Toast.makeText(getApplicationContext(), "开始下载", Toast.LENGTH_LONG).show();
dm.enqueue(request);
}
});

标红的地方是下面171的地方
报错如下:
Process: com.example.yiznan, PID: 6840
java.lang.SecurityException: No permission to write to /storage/emulated/0/Download/1_20200525172223237760.png: Neither user 10079 nor current process has android.permission.WRITE_EXTERNAL_STORAGE.
at android.os.Parcel.readException(Parcel.java:2004)
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:1539)
at android.app.DownloadManager.enqueue(DownloadManager.java:1022)
at com.example.test.MainActivity$4.onDownloadStart(MainActivity.java:171)
at xl.a(PG:519)
at afG.handleMessage(PG:25)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

这个权限是加了的 android.permission.WRITE_EXTERNAL_STORAGE

求大佬指点一二
...全文
154 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
比特灵 初级 2020-05-26
  • 打赏
  • 举报
回复
还有,貌似你的代码里不需要用这个权限,可以直接用系统的默认目录,例如下载的时候仅仅是临时保存一下,可以在下载目录的地方调用这个方法获得目录:

    /**
     * 获得下载目录,外部存储优先
     *
     * @param context 上下文
     * @return File 目录文件对象
     */
    public static File getDownloadFolder(Context context) {
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)
                && !Environment.isExternalStorageRemovable()) {
            return context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS);
        } else {
            return context.getDir(Environment.DIRECTORY_DOWNLOADS, Context.MODE_PRIVATE);
        }
    }
比特灵 初级 2020-05-26
  • 打赏
  • 举报
回复
还漏了一个方法,申请权限后,系统会弹出申请权限界面,用户操作,之后系统回调这个方法,从这个方法里可以看到用户是否选择了授权

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
          if(requestCode == mRequestCode){
         boolean isNotAllPermission = false;
        for (int i = 0; i < permissions.length && i < grantResults.length; i++) {
            //记录是否有权限选项用户没有给权限
            if (grantResults[i] == PackageManager.PERMISSION_DENIED) {
                isNotAllPermission = true;
                break;
            }
        }
        if (isNotAllPermission) {
            Log.d(tag,"没有获得全部授权,会影响应用使用");
            //todo
        }
         
           }
    }
比特灵 初级 2020-05-26
  • 打赏
  • 举报
回复
你这是没有权限,高版本的需要动态申请。你下载的代码可能时比较老,没有相关代码。 动态申请权限,给你贴个例子:

    private final static int mRequestCode = 10000;//权限请求码,自行定义,主要是当系统回调的时候会带回,用于区分

    public static void checkPermisstion(Activity activity, String[] permissions) {
        Log.d(tag, "开始检查权限:" + Build.VERSION.SDK_INT);
        List<String> mPermissionList = new ArrayList<>();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            Log.d(tag, "需要动态授权");
            mPermissionList.clear();
            //逐个判断你要的权限是否已经通过
            for (int i = 0; i < permissions.length; i++) {
                if (ContextCompat.checkSelfPermission(activity, permissions[i]) != PackageManager.PERMISSION_GRANTED) {
                    mPermissionList.add(permissions[i]);//添加还未授予的权限
                    Log.d(tag, "未授权:" + permissions[i]);
                } else {
                    Log.d(tag, "已有权限:" + permissions[i]);
                }
            }
            //申请权限
            if (mPermissionList.size() > 0) {//有权限没有通过,需要申请
                ActivityCompat.requestPermissions(activity, permissions, mRequestCode);
            }
        }
    }

//然后在需要得地方申请,例如activity的onStart
    @Override
    protected void onStart() {
        super.onStart();
        Log.d(tag, "主界面onStart");
        String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE};//这里是数组,可以同时申请多个权限
        checkPermisstion(this, permissions);
    }

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧