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);
}
}9
收起
正在回答 回答被采纳积分+1
2回答
2.Android 网络操作与流行框架
- 参与学习 人
- 提交作业 220 份
- 解答问题 1800 个
本阶段是联网及数据处理的必备技能。课程从网络基础知识到线程间协同工作、异步下载处理;从文件存储、到轻量级数据库SQLite的使用;最后利用最流程的第三方框架助你快速开发企业级APP。
了解课程

恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星