package com.example.chenfengyao.installapkdemo;
import android.app.DownloadManager;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.Cursor;
import android.net.Uri;
import android.os.Binder;
import android.os.Environment;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.util.Log;
import android.util.LongSparseArray;
import com.example.chenfengyao.installapkdemo.utils.IOUtils;
import com.example.chenfengyao.installapkdemo.utils.InstallUtil;
import com.example.chenfengyao.installapkdemo.utils.SystemManager;
import java.io.File;
/**
* If there is no bug, then it is created by ChenFengYao on 2017/4/20,
* otherwise, I do not know who create it either.
*/
public class DownloadService extends Service {
private DownloadManager mDownloadManager;
private DownloadBinder mBinder = new DownloadBinder();
private LongSparseArray<String> mApkPaths;
private DownloadFinishReceiver mReceiver;
@Override
public void onCreate() {
super.onCreate();
mDownloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
mApkPaths = new LongSparseArray<>();
//注册下载完成的广播
mReceiver = new DownloadFinishReceiver();
registerReceiver(mReceiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
@Override
public void onDestroy() {
unregisterReceiver(mReceiver);//取消注册广播接收者
super.onDestroy();
}
public class DownloadBinder extends Binder{
/**
* 下载
* @param apkUrl 下载的url
*/
public long startDownload(String apkUrl){
//点击下载
//删除原有的APK
IOUtils.clearApk(DownloadService.this,"test.apk");
//使用DownLoadManager来下载
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(apkUrl));
//将文件下载到自己的Download文件夹下,必须是External的
//这是DownloadManager的限制
File file = new File(getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "test.apk");
request.setDestinationUri(Uri.fromFile(file));
//添加请求 开始下载
long downloadId = mDownloadManager.enqueue(request);
Log.d("DownloadBinder", file.getAbsolutePath());
mApkPaths.put(downloadId,file.getAbsolutePath());
return downloadId;
}
/**
* 获取进度信息
* @param downloadId 要获取下载的id
* @return 进度信息 max-100
*/
public int getProgress(long downloadId) {
//查询进度
DownloadManager.Query query = new DownloadManager.Query()
.setFilterById(downloadId);
Cursor cursor = null;
int progress = 0;
try {
cursor = mDownloadManager.query(query);//获得游标
if (cursor != null && cursor.moveToFirst()) {
//当前的下载量
int downloadSoFar = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));
//文件总大小
int totalBytes = cursor.getInt(cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));
progress = (int) (downloadSoFar * 1.0f / totalBytes * 100);
}
} finally {
if (cursor != null) {
cursor.close();
}
}
return progress;
}
}
//下载完成的广播
private class DownloadFinishReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
//下载完成的广播接收者
long completeDownloadId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);
String apkPath = mApkPaths.get(completeDownloadId);
Log.d("DownloadFinishReceiver", apkPath);
if (!apkPath.isEmpty()){
SystemManager.setPermission(apkPath);//提升读写权限,否则可能出现解析异常
InstallUtil.install(context,apkPath);
}else {
Log.e("DownloadFinishReceiver", "apkPath is null");
}
}
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
InstallAPK.zip (48个子文件)
InstallAPKDemo
.gitignore 2KB
gradle
wrapper
gradle-wrapper.jar 52KB
gradle-wrapper.properties 230B
local.properties 498B
build.gradle 498B
gradlew.bat 2KB
gradlew 5KB
app
.gitignore 7B
build.gradle 1KB
proguard-rules.pro 939B
app.iml 13KB
src
test
java
com
example
chenfengyao
installapkdemo
ExampleUnitTest.java 416B
main
AndroidManifest.xml 1KB
java
com
example
chenfengyao
installapkdemo
utils
SystemManager.java 2KB
IOUtils.java 1KB
InstallUtil.java 2KB
DownloadService.java 5KB
MainActivity.java 4KB
.DS_Store 6KB
res
values
styles.xml 383B
colors.xml 208B
strings.xml 77B
mipmap-xxhdpi
ic_launcher_round.png 10KB
ic_launcher.png 8KB
layout
activity_main.xml 864B
xml
file_path.xml 196B
mipmap-xhdpi
ic_launcher_round.png 6KB
ic_launcher.png 5KB
raw
zhihu.apk 26.54MB
mipmap-hdpi
ic_launcher_round.png 4KB
ic_launcher.png 3KB
drawable
install_mode_selector.xml 218B
mipmap-mdpi
ic_launcher_round.png 2KB
ic_launcher.png 2KB
mipmap-xxxhdpi
ic_launcher_round.png 14KB
ic_launcher.png 10KB
.DS_Store 6KB
androidTest
java
com
example
chenfengyao
installapkdemo
ExampleInstrumentedTest.java 780B
.DS_Store 6KB
build
.DS_Store 6KB
InstallAPKDemo.iml 868B
build
generated
mockable-android-25.jar 32.3MB
intermediates
jack-cache
cache.xml 7KB
android-profile
profile-2018-03-06-16-46-01-559.rawproto 502B
profile-2018-03-06-16-48-01-810.rawproto 500B
profile-2017-04-20-14-15-05-084.rawproto 6KB
gradle.properties 730B
settings.gradle 15B
共 48 条
- 1
资源评论
- sillycat_m2019-04-24好资源,能够支持7.0以上的机型使用。谢谢
- qq_412771942020-03-10很好用谢谢分享
- 仇无恨2018-09-28好资源,能够支持7.0以上的机型使用。谢谢
- dzh_fly2021-03-28讨论是不是认真的,这么贵,没什么参考价值
AImmorta1
- 粉丝: 34
- 资源: 14
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功