android9.0,已参照3-5添加动态获取权限

android9.0,已参照3-5添加动态获取权限

2019-11-25 17:24:05.479 16116-16155/com.example.handlerproject D/NetworkSecurityConfig: Using Network Security Config from resource network_security_config debugBuild: true
2019-11-25 17:24:05.587 16116-16155/com.example.handlerproject W/System.err: java.io.FileNotFoundException: /data/cache/imooc/imooc.apk (Permission denied)
2019-11-25 17:24:05.588 16116-16155/com.example.handlerproject W/System.err:     at java.io.FileOutputStream.open0(Native Method)
2019-11-25 17:24:05.589 16116-16155/com.example.handlerproject W/System.err:     at java.io.FileOutputStream.open(FileOutputStream.java:308)
2019-11-25 17:24:05.589 16116-16155/com.example.handlerproject W/System.err:     at java.io.FileOutputStream.<init>(FileOutputStream.java:238)
2019-11-25 17:24:05.589 16116-16155/com.example.handlerproject W/System.err:     at java.io.FileOutputStream.<init>(FileOutputStream.java:119)
2019-11-25 17:24:05.589 16116-16155/com.example.handlerproject W/System.err:     at com.example.handlerproject.DownloadActivity.download(DownloadActivity.java:128)
2019-11-25 17:24:05.589 16116-16155/com.example.handlerproject W/System.err:     at com.example.handlerproject.DownloadActivity.access$000(DownloadActivity.java:27)
2019-11-25 17:24:05.589 16116-16155/com.example.handlerproject W/System.err:     at com.example.handlerproject.DownloadActivity$2$1.run(DownloadActivity.java:89)
2019-11-25 17:24:05.589 16116-16155/com.example.handlerproject W/System.err:     at java.lang.Thread.run(Thread.java:764)

代码:

package com.example.handlerproject;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

public class DownloadActivity extends AppCompatActivity {


    public static final int DOWNLOAD_MESSAGE_CODE = 100001;
    public static final String APP_URL = "http://download.sj.qq.com/upload/connAssitantDownload/upload/MobileAssistant_1.apk";
    private static final int DOWNLOAD_MESSAGE_FAIL_CODE = 100002;
    private Handler mHandler;

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_download);

//        动态获取读写权限
        int permisson = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
        if(permisson != PackageManager.PERMISSION_GRANTED){
            ActivityCompat.requestPermissions(this, new String[]{
                    Manifest.permission.WRITE_EXTERNAL_STORAGE,
                    Manifest.permission.READ_EXTERNAL_STORAGE
            }, 1);
        }


        /**
         * 主线程 --> start
         * 点击下载
         * 发起下载
         * 开启子线程做下载
         * 下载过程中通知主线程 | --> 主线程更新进度条
         *
         */
        Button button = findViewById(R.id.download);
        final ProgressBar progressBar = findViewById(R.id.progressBar);
        mHandler = new Handler(){
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                switch (msg.what){
                    case DOWNLOAD_MESSAGE_CODE:
                        progressBar.setProgress((Integer) msg.obj);
                        break;
                    case DOWNLOAD_MESSAGE_FAIL_CODE:
                        break;
                }
            }
        };
        /**
         * 点击下载事件
         */
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                /**
                 * 子线程中下载apk
                 */
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        download(APP_URL);


                    }
                }).start();
            }
        });
    }

    private void download(String appUrl) {
        try {
            URL url = new URL(appUrl);
            URLConnection urlConnection = url.openConnection();
            InputStream inputStream = urlConnection.getInputStream();//获取URLConnection响应的内容
            /**
             * 获取文件总长度
             */
            int contentLength = urlConnection.getContentLength();
            /**
             * 存放文件路径地址名称
             */
            String downloadFolderName = Environment.getDownloadCacheDirectory() + File.separator
                    + "imooc" + File.separator;
            /**
             * 查看文件目录是否存在
             */
            File file = new File(downloadFolderName);
            if(!file.exists()){
                file.mkdir();
            }
            String fileName = downloadFolderName + "imooc.apk";
            File apkFile = new File(fileName);
            //
            if(apkFile.exists()){
                apkFile.delete();
            }
            int downloadSize = 0;
            byte[] bytes = new byte[1024];
            int length;
            OutputStream outputStream = new FileOutputStream(fileName);
            while ((length = inputStream.read(bytes)) != -1){
                outputStream.write(bytes, 0, length);
                downloadSize += length;
                /**
                 * 更新进度条UI
                 */
                Message message = Message.obtain();
                message.obj = downloadSize * 100 / contentLength;
                message.what = DOWNLOAD_MESSAGE_CODE;
                mHandler.sendMessage(message);
            }
//            关闭输入输出流
            inputStream.close();
            outputStream.close();

        } catch (MalformedURLException e) {
            //发送失败消息
            notifyDownloadFaild();
            e.printStackTrace();
        } catch (IOException e) {
            notifyDownloadFaild();
            e.printStackTrace();
        }
    }

    private void notifyDownloadFaild() {
        Message message = Message.obtain();
        message.what = DOWNLOAD_MESSAGE_FAIL_CODE;
        mHandler.sendMessage(message);
    }
}


正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

2回答
irista23 2019-11-26 10:11:32

这里你要判断requestCode如果是1,才能去进行下载等一系列操作

http://img1.sycdn.imooc.com//climg/5ddc89b209e2efad06910105.jpg

irista23 2019-11-25 17:42:17

清单文件中的如下权限是否添加了呢

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

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



  • 提问者 yqyily #1
    已经加过了,但问题还是存在 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.handlerproject"> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:networkSecurityConfig="@xml/network_security_config" android:supportsRtl="true" android:theme="@style/AppTheme"> <!-- <activity android:name=".DownloadActivity"></activity>--> <activity android:name=".DownloadActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
    2019-11-26 09:02:35
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
2.Android 网络操作与流行框架
  • 参与学习           人
  • 提交作业       220    份
  • 解答问题       1800    个

本阶段是联网及数据处理的必备技能。课程从网络基础知识到线程间协同工作、异步下载处理;从文件存储、到轻量级数据库SQLite的使用;最后利用最流程的第三方框架助你快速开发企业级APP。

了解课程
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师