我在项目中使用了 compile ‘com.jph.takephoto:takephoto_library:4.0.3’ 这个依赖 也是最新的依赖,然后我要做版本升级,就是下载好新的apk的时候去跳转安装,为啦适配7.0以上的机型做了如下的操作
对于7.0以上的 我们要先共享某个文件夹,才能使用里面的文件,
file_paths的内容如下
<resources>
<paths>
<external-path
name="files_root"
path="Android/data/我的包名/" />
<external-path
name="external_storage_root"
path="." />
paths>
resources>
在清单文件中加入代码
//这里本来应该是 android:name="android.support.v4.content.FileProvider" 稍后解释
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="我的包名.fileProvider"
android:exported="false"
android:grantUriPermissions="true"
tools:replace="name,authorities,exported,grantUriPermissions">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"
tools:replace="name,resource" />
provider>
Intent intent=new Intent(Intent.ACTION_VIEW);
if(Build.VERSION.SDK_INT>= Build.VERSION_CODES.N) {
//file 就是下载好的apk安装包
Uri contentUri = FileProvider.getUriForFile(this,"我的包名.fileProvider",file);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.setDataAndType(contentUri,"application/vnd.android.package-archive");
}else{
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setDataAndType(Uri.fromFile(file),"application/vnd.android.package-archive");
}
//跳转到安装的界面
this.startActivity(intent);
根据提示在上面节点中 加入这句话
本来加入到了 application的节点下 但是发现,又会报如下错误
不知如何解决了 最后吧这句话加入到了provider的节点下,编译通过,不报错了
并且下载好的安装包也能跳转到安装界面了,但是会发现 这个头像的功能就不能使用了,原因好像是这句话 tools:replace=”name,authorities,exported,grantUriPermissions”,意思就是 替换成了自己的共享目录,所以导致了头像功能失效,于是陷入了 更新不能用头像 用头像不恩能够更新的地步,最后百度了好久终于 找到了解决方案;
先是下载了takephoto_library的源码找到了原因
我发现takephoto_library中也使用了这样的注册信息
//takephoto_library中的清单文件信息
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.jph.takephoto" >
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
<application
android:allowBackup="true">
<activity android:name="com.soundcloud.android.crop.CropImageActivity" />
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:grantUriPermissions="true"
android:exported="false">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
provider>
application>
manifest>
文件信息代码
<resources>
<paths>
<root-path path="" name="camera_photos" />
paths>
resources>
即使我吧自己的文件名字改成和他不一样的 也依然会报错,因为主要原因不是因为 文件名冲突,而是清单文件中的
android:name=”android.support.v4.content.FileProvider”这一句话冲突
于是我在自己项目中继承了android.support.v4.content.FileProvider 未做任何的处理 改为自己的类
将自己的清单文件中的注册 改为如下
<provider
android:name="包路径.MyFileProvider"
android:authorities="我的包名.fileProvider"
android:exported="false"
android:grantUriPermissions="true"
tools:replace="name,authorities,exported,grantUriPermissions">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"
tools:replace="name,resource" />
provider>
让后编译 运行 完美解决
http://blog.csdn.net/liuyu0915/article/details/72621905
希望这篇乱糟糟的文章能够帮到你!!!我这是个人做笔记,见谅