DownloadManager之大坑

在学习Android网络编程使用DownloadManager时,遇到了权限和网络安全配置的问题。初次调试因缺少INTERNET权限导致SecurityException;再次调试时,虽然添加了权限,但因networkSecurityConfig属性未设置,使得应用无法正常工作。解决方法包括在AndroidManifest中添加networkSecurityConfig属性,并创建相应的xml配置文件。

前言

最近在学网络编程, 学到DownloadManager时, 觉得也就几个方法, 那就整一下呗!心里想着也应该花不了多久。我就打算到网络上 下载个应用瞅瞅。

代码

Java部分:

package com.example.myapplication;
import android.app.DownloadManager;
import android.app.DownloadManager.Request;
import android.content.Context;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private static DownloadManager mDownloadManager;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.button).setOnClickListener(this);
        // 从系统服务中获取下载管理器
        mDownloadManager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
    }
    @Override
    public void onClick(View v) {
        //这里就直接写了一个地址,访问就能下载一个apk。
        Uri uri = Uri.parse("https://3g.lenovomm.com/w3g/yydownload/com.kugou.android/60020");
        Request request = new Request(uri);
        request.setAllowedNetworkTypes(Request.NETWORK_MOBILE | Request.NETWORK_WIFI);
        
        request.setTitle("正在下载");
        request.setDescription("下载中");
        
        request.setAllowedNetworkTypes(Request.NETWORK_MOBILE
                | Request.NETWORK_WIFI);
	  //后缀名为2.apk
        request.setDestinationInExternalFilesDir(
                this, Environment.DIRECTORY_DOWNLOADS,2 + ".apk");
        request.setNotificationVisibility(Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
        request.setVisibleInDownloadsUi(true);
        
        long downloadId = mDownloadManager.enqueue(request) ;
    }
}

XML部分:
至于xml中,就只需要一个button就行,这里就不写了

调试

第一次调试

出现了这个错误

java.lang.SecurityException: Permission Denial: writing com.android.providers.downloads.DownloadProvider uri content://downloads/my_downloads from pid=13495, uid=10155 requires android.permission.INTERNET, or grantUriPermission()

办法:简单,加个这个权限 <uses-permission android:name="android.permission.INTERNET"/>

第二次调试

继续调,哐当响一下,就给我整了个这个:在这里插入图片描述
然后我就展开了调试,但logcat上面也没有提示出错的信息,调试了大半天,一无所获,完全不知道自己错在何处。 整个人都搞蒙了,开始怀疑人生了。就是感觉自己没有错, 但是结果却是错的。

解决方案

只得自己找找资料了,查了很久, 发现我的AndroidManifest文件中有一个属性没有写,
就是这个玩意:大概就是确保网络安全的意思吧,有兴趣的小伙伴自己查。

networkSecurityConfig

刚开始还不以为然,后面才发现就是它的问题!!!

第一步

在AndroidManifest的Application下加上这句话:

android:networkSecurityConfig="@xml/network_security_config"

第二步

新建一个xml文件, 在里面写一个network_security_config文件 具体如下:
在这里插入图片描述

第三步

network_security_config的内容

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true" />
</network-security-config>
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值