Android 在线下载更新App 下载完成安装APK(兼容Android7.0)
2017-12-06 11:52
971 查看
先上图:
首先对android7.0的打开文件方式进行适配
第一步:
在AndroidManifest.xml清单文件中注册provider,因为provider也是Android四大组件之一,可以简单把它理解为向外提供数据的组件,这种组件在实际开发中用的频率并不高,四大组件都可以在清单文件中进行配置。
注意:
URI 临时访问权限。
第二步:指定共享的目录
上面配置文件中
我们需要在资源(res)目录下创建一个xml目录,然后创建一个名为“file_paths”(名字可以随便起,只要和在manifest注册的provider所引用的resource保持一致即可)的资源文件,内容如下:
<files-path/>代表的根目录: Context.getFilesDir()
<external-path/>代表的根目录: Environment.getExternalStorageDirectory()
<cache-path/>代表的根目录: getCacheDir()
上述代码中path="",是有特殊意义的,它代码根目录,也就是说你可以向其它的应用共享根目录及其子目录下任何一个文件了。
如果你将path设为path="pictures",那么它代表着根目录下的pictures目录(eg:/storage/emulated/0/pictures),如果你向其它应用
4000
分享pictures目录范围之外的文件是不行的。
第三步:使用FileProvider
上述准备工作做完之后,现在我们就可以使用FileProvider了。会在下个代码块中注释中具体解释
下面是下载安装的具体逻辑
首先在服务中创建DownloadManager
然后在anctivity中与服务bind绑定 布局文件只有一个按钮来模拟
最后添加权限 动态权限前文有使用介绍 这里我没有使用动态权限
首先对android7.0的打开文件方式进行适配
使用FileProvider
第一步:在AndroidManifest.xml清单文件中注册provider,因为provider也是Android四大组件之一,可以简单把它理解为向外提供数据的组件,这种组件在实际开发中用的频率并不高,四大组件都可以在清单文件中进行配置。
<application ...> <provider android:name="android.support.v4.content.FileProvider" android:authorities="com.example.dl.install" android:grantUriPermissions="true" android:exported="false"> <!--元数据--> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider> </application>
注意:
exported:要求必须为false,为true则会报安全异常。
grantUriPermissions:true,表示授予
URI 临时访问权限。
authorities组件标识,按照江湖规矩,都以包名开头,避免和其它应用发生冲突。
第二步:指定共享的目录
上面配置文件中
android:resource="@xml/file_paths"指的是当前组件引用
res/xml/file_paths.xml这个文件。
我们需要在资源(res)目录下创建一个xml目录,然后创建一个名为“file_paths”(名字可以随便起,只要和在manifest注册的provider所引用的resource保持一致即可)的资源文件,内容如下:
<?xml version="1.0" encoding="utf-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android"> <paths> <external-path path="" name="download"/> </paths> </resources>
<files-path/>代表的根目录: Context.getFilesDir()
<external-path/>代表的根目录: Environment.getExternalStorageDirectory()
<cache-path/>代表的根目录: getCacheDir()
上述代码中path="",是有特殊意义的,它代码根目录,也就是说你可以向其它的应用共享根目录及其子目录下任何一个文件了。
如果你将path设为path="pictures",那么它代表着根目录下的pictures目录(eg:/storage/emulated/0/pictures),如果你向其它应用
4000
分享pictures目录范围之外的文件是不行的。
第三步:使用FileProvider
上述准备工作做完之后,现在我们就可以使用FileProvider了。会在下个代码块中注释中具体解释
下面是下载安装的具体逻辑
首先在服务中创建DownloadManager
public class DownloadService extends Service { private DownloadFinishReceiver mReceiver; public DownloadService() { } @Override public void onCreate() { super.onCreate(); //注册下载完成的广播 mReceiver = new DownloadFinishReceiver(); registerReceiver(mReceiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE)); } @Override public IBinder onBind(Intent intent) { return new DownBinder(); } class DownBinder extends Binder{ public void startDownload (String downUrl) { //删除已经存在的apk包 File apkFile = new File(DownloadService.this.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "小熊.apk"); if (apkFile.exists()) { apkFile.delete(); } //初始化DownloadManager并开始下载 DownloadManager.Request request = new DownloadManager.Request(Uri.parse(downUrl)); File file = new File(getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS),"小熊.apk"); request.setDestinationUri(Uri.fromFile(file)); DownloadManager mDownloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE); mDownloadManager.enqueue(request); } } //下载完成的广播 private class DownloadFinishReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { //Android获取一个用于打开APK文件的intent Intent intent1 = new Intent(Intent.ACTION_VIEW); // 由于没有在Activity环境下启动Activity,设置下面的标签 intent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); if(Build.VERSION.SDK_INT>=24) { //判读版本是否在7.0以上 //参数1 上下文, 参数2 Provider主机地址 和配置文件中保持一致 参数3 共享的文件 Uri apkUri = FileProvider.getUriForFile(DownloadService.this, "com.example.dl.install", new File(getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS),"小熊.apk")); //添加这一句表示对目标应用临时授权该Uri所代表的文件 intent1.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); intent1.setDataAndType(apkUri, "application/vnd.android.package-archive"); }else{ intent1.setDataAndType(Uri.fromFile(new File(getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS),"小熊.apk")), "application/vnd.android.package-archive"); } DownloadService.this.startActivity(intent1); } } @Override public void onDestroy() { super.onDestroy(); unregisterReceiver(mReceiver); } }
然后在anctivity中与服务bind绑定 布局文件只有一个按钮来模拟
public class MainActivity extends AppCompatActivity implements View.OnClickListener { private Button btn; private DownloadService.DownBinder binder; private ServiceConnection connection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { binder = (DownloadService.DownBinder) service; } @Override public void onServiceDisconnected(ComponentName name) { } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); //与服务连接 Intent intent = new Intent(MainActivity.this,DownloadService.class); startService(intent); bindService(intent,connection,BIND_AUTO_CREATE); } private void initView() { btn = (Button) findViewById(R.id.btn); btn.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn: binder.startDownload("http://cdn.xiaoxiongyouhao.com/apps/androilas.apk"); break; } } }
最后添加权限 动态权限前文有使用介绍 这里我没有使用动态权限
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
相关文章推荐
- android的APP自动更新程序,检测版本,然后下载安装,但app安装后不提示“完成,打开”?
- android7.0 apk下载完成后跳转到apk安装页面闪退的兼容处理
- android7.0 apk下载完成后跳转到apk安装页面闪退的兼容处理
- Android基础--下载安装app,会提示完成和打开,点击打开运行所产生的问题
- Android 一步一步实现版本自动更新(第二步 下载和安装apk)
- 下载安装APK(兼容Android7.0)
- android在线下载并安装APK
- android7.0 照相和图片剪裁 以及 应用内部apk更新下载安装适配
- android的APP版本更新工具类(下载并安装)
- Android下载app完成后自动安装
- Android 程序自动安装下载好的apk 、程序的安装、卸载和更新
- 下载安装APK(兼容Android7.0)
- Android开发实践经验谈:如何让各式手机浏览器可以直接下载apk安装文件且实现自动安装APP
- Android 版本更新下载自动安装APK,并解决Android6.0安装失败的问题
- Android 通过蒲公英pgyer的接口 Service 实现带进度下载App 通知栏显示 在线更新 自动更新Demo
- android中程序更新下载完成后自动跳转安装界面
- android 应用升级 下载安装包 完成后 自动安装apk文件
- Android 自动更新APP时确定安装后没有显示安装完成页面
- Android APP更新——service后台下载、进度提示、自动安装
- Android客户端apk自动检测更新自动下载自动安装的实现方法