You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android WebView应用:点击下载按钮时请求存储权限的实现方法

实现点击下载按钮时触发权限请求弹窗

没问题,我们可以把权限请求逻辑从应用启动阶段移到用户点击下载按钮的时机,具体可以按以下步骤来调整代码:

1. 移除启动时的权限请求代码

首先删掉你在onCreate方法里添加的权限检查代码,我们要把这个逻辑放到下载触发的时候。

2. 定义成员变量存储待下载链接

在你的Activity类中添加一个成员变量,用来临时保存用户点击的下载链接,这样权限通过后我们可以继续执行下载:

private String mPendingDownloadUrl;

3. 修改shouldOverrideUrlLoading方法

把权限检查逻辑移到这里,当检测到是图片下载链接时,先判断权限状态:

@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
    if (url.endsWith(".jpg")) {
        // 检查存储权限是否已授予
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED) {
            // 权限未授予,保存当前下载链接并发起权限请求
            mPendingDownloadUrl = url;
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                    1024); // 这个请求码要和后续回调保持一致
            return true; // 拦截当前URL加载,等待权限处理
        } else {
            // 权限已授予,直接执行下载逻辑
            startDownload(url);
            return true;
        }
    }
    // 非图片链接按默认逻辑处理
    return super.shouldOverrideUrlLoading(view, url);
}

4. 抽离下载逻辑为单独方法

把原来的下载代码封装成一个独立方法,方便重复调用:

private void startDownload(String url) {
    Uri source = Uri.parse(url);
    DownloadManager.Request request = new DownloadManager.Request(source);
    
    // 设置下载通知栏的描述和标题
    request.setDescription("Downloading image");
    request.setTitle("PunjabiDharti.jpg");
    
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        request.allowScanningByMediaScanner();
        request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
    }
    
    // 指定文件保存路径
    request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "PunjabiDharti.jpg");
    
    // 发起下载请求
    DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
    if (manager != null) {
        manager.enqueue(request);
    }
}

5. 处理权限请求回调

重写onRequestPermissionsResult方法,根据用户的权限选择执行对应的操作:

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == 1024) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // 权限授予成功,执行待处理的下载
            if (!TextUtils.isEmpty(mPendingDownloadUrl)) {
                startDownload(mPendingDownloadUrl);
                mPendingDownloadUrl = null; // 下载完成后清空临时变量
            }
        } else {
            // 权限被拒绝,提示用户无法完成下载
            Toast.makeText(this, "需要存储权限才能下载图片", Toast.LENGTH_SHORT).show();
        }
    }
}

6. 确保Manifest中声明权限

别忘了在AndroidManifest.xml里添加必要的权限声明:

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

这样调整后,只有当用户点击HTML里的下载按钮时,才会触发存储权限的请求弹窗,授权成功后才会开始下载图片。

内容的提问来源于stack exchange,提问作者Chand Ninder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:26:28