
先上图:

首先对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>
注意:
第二步:指定共享的目录

上面配置文件中android:resource="@xml/file_paths"指的是当前组件引用res/xml/file_paths.xml这个文件。
eclipse下工程引用了其他工程作为库app播放器下载apk安装,但是这个在eclipse编译环境下才可以,unity想要实现这样的效果就得生成引用库的jar包以及把引用库中的res资源全部整合进asset/plugins/android/res下,问题是在eclipse下生成的r.java中资源id值与unity导出apk生成的r.java的资源id值不相同,导致运行时会报资源找不到的问题。之前的尝试中,apps下每个app一个子目录,如果只在installed_apps中添加"apps"这一项而不注册子目录,django无法autodiscover_tasks到子目录(google出来的例子是每个子目录都注册),看来autodiscover_tasks只支持注册目录下tasks.py文件的监测、而不支持注册目录下子目录的tasks.py文件的监测(如果支持,那么celery worker的--autoreload也可以检测到子目录的tasks.py文件,那么apps子目录支持的问题就解决了)。最后小tips:新的帐号登陆前,请做以下操作——打开你的wow安装目录下的\wtf\account目录,建立一个全部大写的 新帐号(b帐号)文件夹,copy你的wow安装目录下的\wtf\account\a帐号名字\目录下所有文件 到 \wtf\account\b帐号名字\下,这样你登陆新帐号的时候,所有的按键设置,游戏设置,插件设置全都和原来一样,不需要重新调试。
<?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()

6.rootpath是站点的物理路径 \代表安装文件根目录 您只能使用安装目录下的目录,无法使用上级及更上级目录,这就意味这app播放器下载apk安装,您将不能使用 如:c:\aa\bb这样的目录,所有有效的目录都限制在安装根目录下,即是您只能使用 如:\xxx 或\xxx\yy 这样的目录。6.rootpath是站点的物理路径 代表安装文件根目录 您只能使用安装目录下的目录,无法使用上级及更上级目录,这就意味这,您将不能使用 如:c:aabb这样的目录,所有有效的目录都限制在安装根目录下,即是您只能使用 如:xxx 或xxxyy 这样的目录。[00:46.70]背く事の出来ぬロジック <:53,1代表未来>,即将收束>.40]过去は离れて行き未来は近づくの,即将收束>。
<cache-path/>代表的根目录: getCacheDir()
上述代码中path="",是有特殊意义的,它代码根目录,也就是说你可以向其它的应用共享根目录及其子目录下任何一个文件了。
如果你将path设为path="pictures",那么它代表着根目录下的pictures目录(eg:/storage/emulated/0/pictures),如果你向其它应用分享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;
}
}
}
最后添加权限 动态权限前文有使用介绍 这里我没有使用动态权限
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/bofangqi/article-112161-1.html
采取撞击战术最合适
挺好的