美文网首页
android中大于7.0apk升级情况要通过FileProvi

android中大于7.0apk升级情况要通过FileProvi

作者: gdlooker | 来源:发表于2018-12-27 14:28 被阅读0次

    参考教程地址:

    https://www.jianshu.com/p/ac5fe346a5b7
    https://blog.csdn.net/wanghao200906/article/details/79218051
    https://www.cnblogs.com/yishaochu/archive/2017/09/07/7488589.html
    http://lazybios.com/2016/12/install-apk-by-intent-compatible-adnroid-n/
    https://blog.csdn.net/qq_36707431/article/details/81774055 //跟Android8.0安装权限问题
    出现2个问题 卡了好久
    第一个问题 从服务器端下载通过retrofit获取到输入流 下载到sdk指定目录 然后 切忌要记得判断
    文件或者文件夹是否存在
    第二个问题 由于Android7.0以上 安装要安装 权限必须要在配置清单文件中进行配置
    配置清单文件的authorities="${applicationId.fileProvider}" //这个fileProvider 注意打小写 一定要跟
    java代码里面的intent里面所对应的大小写一致 不然直接gg 报以下错误
    Attempt to invoke virtual method 'android.content.res.XmlResourceParser android.content.pm.PackageItemInfo.loadXmlMetaData(android.content.pm.PackageManager, java.lang.String)' on a null object reference

    我的配置清单代码如下: (因为我是在分工程 所以没有运行的Activity)

    ?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    ​    package="com.example.admin.rxjava">
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.CALL_PHONE" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    <!-- 请求安装权限 8.0 -->
    <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
    <application>
        <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="com.example.admin.rxjava.fileProvider" //这里的fileProvider一定要跟 下面的 uri的fileProvider一致
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths" />
        </provider>
    
        <activity android:name=".ui.activity.PublishMainActivity"></activity>
    </application>
    </manifest>
    

    res目录下新建的xml目录的file_paths.xml文件代码如下:

    <?xml version="1.0" encoding="utf-8"?>
    <resources xmlns:android="http://schemas.android.com/apk/res/android">
        <paths>
            <external-path
                name="."
                path="." />
        </paths>
    </resources>
    

    app版本升级 拿到服务器端的apk地址 将apk下载到本地的目录 通过Javaio流

    // Environment.getExternalStorageDirectory() 那么file_paths文件就是用 <external-path name="." path="." />

    
    public  void installApk(Activity activity) {
            if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
                String path = Environment.getExternalStorageDirectory().getPath();
                File dir = new File(path);
                File file = new File(dir, "gdchent.apk");
                if(!file.exists()){
                    try {
                        file.createNewFile(); //创建文件  
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }else{
                    Log.i("gdchent","文件存在");
                }
                Intent intent = new Intent(Intent.ACTION_VIEW);
                if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
                    //小于7.0
                    intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                } else {
                    //com.example.admin.rxjava
                    //大于7.0
                    // 声明需要的临时权限
                    intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                    // 第二个参数,即第一步中配置的authorities
                    String packageName = activity.getApplication().getPackageName();
                    Log.i("gdchent","package:"+packageName);
                    Log.i("gdchent","ab_path:"+file.getAbsolutePath());
                    Uri contentUri = FileProvider.getUriForFile(activity, packageName + ".fileProvider", file);
                    intent.setDataAndType(contentUri, "application/vnd.android.package-archive");
                }
                activity.startActivity(intent);
            }
        }
    

    github传送门地址:https://github.com/gdchent/AppUpdateDemo

    相关文章

      网友评论

          本文标题:android中大于7.0apk升级情况要通过FileProvi

          本文链接:https://www.haomeiwen.com/subject/wsmrlqtx.html