android 10或者targetSdkVersion=26情况下,升级apk有问题

最近遇到两个情况,

情况一:android8.0以上,targetSdkVersion=26,程序升级下载之后,就直接闪退;

             修改: android8.0以上,targetSdkVersion=22,程序升级下载之后,可以直接安装

情况二:android 10,targetSdkVersion=22,程序升级下载之后,就直接闪退;

所以结合以上的两种情况, android8.0以上,targetSdkVersion=22无法解决android10升级问题,所以才在去研究的。

之前下载完apk后,下载apk的DownloadService.class里面升级的代码如下:

private File outputFile;
outputFile = new File(Environment.getExternalStoragePublicDirectory
             (Environment.DIRECTORY_DOWNLOADS), "file.apk");

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setDataAndType(Uri.fromFile(outputFile), "application/vnd.android.package-archive");
startActivity(intent);

解决办法:

第一步,在AndroidManifest.xml中

1、增加权限: 

<!--自动安装apk-->

<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />    

<!--允许装载和卸载文件系统权限-->

<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />

2、增加provider,如下代码:(com.zoesoft.zymobilenurse是项目的包名)

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp">
    <application
        ...>
        <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="com.zoesoft.zymobilenurse.fileprovider"
            android:grantUriPermissions="true"
            android:exported="false">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/filepaths" />
        </provider>
        ...
    </application>
</manifest>

第二步,指定想分享的目录。在res目录下新建一个xml目录,在xml目录下面新建一个xml文件。我新建的文件名叫filepaths.xml(升级apk我这边是下载在Download文件夹里面)

<paths xmlns:android="http://schemas.android.com/apk/res/android">

    <!--代表外部存储区域的根目录下的文件 Environment.getExternalStorageDirectory()/Downloads目录-->
    <external-path name="Download" path="Download" />
</paths>

第三步,下载apk的DownloadService.class修改

// private File outputFile; // 存放apk的file
// outputFile = new File(Environment.getExternalStoragePublicDirectory
//             (Environment.DIRECTORY_DOWNLOADS), "file.apk");

Intent intent = new Intent();
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setAction(Intent.ACTION_VIEW);
if (Build.VERSION.SDK_INT >= 24) {
       Uri apkUri = FileProvider.getUriForFile(this, "com.zoesoft.zymobilenurse.fileprovider", outputFile);
       intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
       intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
} else {
       intent.setDataAndType(Uri.parse("file://" + outputFile.toString()), "application/vnd.android.package-archive");
}
startActivity(intent);

android 9以上,启动相机报错

    public static void startCamera(Activity activity) {
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        //适配7.0拍照取uri的处理
        if(Build.VERSION.SDK_INT < 24){
            intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(
                    Environment.getExternalStorageDirectory(), TMP_PATH)));
        }else{
            Uri uri= FileProvider.getUriForFile(activity,"com.zoesoft.zymobilenurse.fileprovider",new File(
                    Environment.getExternalStorageDirectory(), TMP_PATH));
            intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION );//添加这一句表示对目标应用临时授权该Uri所代表的文件
        }
        activity.startActivityForResult(intent, CAMERA_WITH_DATA);
    }

注意:

遇到的报错

参考:Attempt to invoke virtual method 'android.content.res.XmlResourceParser

有问题欢迎指出。

参考链接:

FileProvider 的使用(Failed to find configured root that contains/storage/emulated/0/DCIM/ )

java.lang.IllegalArgumentException: Failed to find configured root that contains 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Android 项目是使用 Android 操作系统和相关开发工具开发的一款移动应用程序。Android 平台提供了丰富的功能和接口,开发人员可以使用 Java 或 Kotlin 等编程语言编写 Android 应用程序。Android 项目也可以是针对特定设备或特定需求进行自定义开发的软件解决方案。 以下是 Android 项目的一些主要特点和资料介绍: 1. 开放源代码:Android 是基于 Linux 内核的开源操作系统,开发人员可以自由获取、使用和修改源代码。 2. 多样化的硬件设备支持:Android 支持多种硬件设备和屏幕尺寸,可以运行于手机、平板电脑、电视、手表等多种设备上。 3. 灵活的用户界面:Android 提供了丰富的用户界面控件和布局方式,可以实现漂亮、个性化的用户界面。 4. 响应式设计:Android 应用程序可以根据设备类型、屏幕尺寸等因素调整布局和显示方式,以适应不同的设备和用户需求。 5. 多媒体支持:Android 支持常见的音频、视频、图像等多媒体格式,可以实现各种多媒体应用。 6. 数据存储:Android 提供了多种数据存储方式,包括 SQLite 数据库、文件存储、SharedPreferences 等。 7. 网络通信:Android 支持多种网络通信方式,包括 HTTP、TCP、UDP 等。 8. 社交媒体集成:Android 提供了集成社交媒体的功能,可以实现与 Facebook、Twitter、Google+ 等社交媒体的交互。 # 注意 1. 本资源仅用于开源学习和技术交流。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。 3. 不可商用,一切后果由使用者承担。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值