0
点赞
收藏
分享

微信扫一扫

Bugly升级SDK适配Android N,androidndk开发书籍

菜菜捞捞 2022-01-31 阅读 66

这里写图片描述

name表示一个URI路径段,path表示指定要分享路径的子目录。可以看到我配置了两个external-path,这两个路径都是beta下载的文件可能存在的路径,举个例子,第一个路径存在的uri如下:

content://com.bugly.upgrade.demo.fileProvider/beta_external_apk/combuglyupgradedemo_21_d778bda9-f3c5-4608-b5ea-2df2a2372f91.apk

可以看到我们配置的beta_external_apk成为了URI的一个路径段。

我们还可以指定以下路径:

表示路径在应用中的内部存储区域中files目录下的
子目录下,files-path表示Context.getFilesDir()的根目录。

例如:/data/data/com.bugly.upgrade.demo/files

表示路径在应用中红内部存储区域中cache目录下的子目录下,cache-path表示Context.getCacheDir()的根目录。

例如:/data/data/com.bugly.upgrade.demo/cache

表示路径在外部存储区域根目录的子目录,external-path表示Environment.getExternalStorageDirectory()的根目录。

例如:/storage/emulated/0

表示路径在外部存储区域根目录的缓存目录,external-cache-path表示Context.getExternalCacheDir()

例如:/storage/emulated/0/Android/data/com.bugly.upgrade.demo/cache

  1. 通过FileProvider获取Uri路径

示例代码:

Uri uri = Uri.fromFile(file);

可以更改为:

Uri uri = FileProvider.getUriForFile(context,

BuildConfig.APPLICATION_ID + “.fileProvider”, file);

因为我们SDK不会引入support-v4包,所以不能通过上面这种方式直接获取uri,最后考虑通过反射来调用getUriForFile方法,具体实现如下:

Intent i = new Intent(Intent.ACTION_VIEW);

if (Build.VERSION.SDK_INT >= 24) {

i.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

// 反射获取FileProvider类型

Class<?> clazz = Class.forName(“android.support.v4.content.FileProvider”);

if (clazz == null) {

ELog.error(“can’t find class android.support.v4.content.FileProvider”);

return false;

}

// 通过反射调用FileProvider.getUriForFile

Uri contentUri = (Uri) Utils.invokeReflectMethod(“android.support.v4.content.FileProvider”, “getUriForFile”

, null, new Class[]{Context.class, String.class, File.class},

new Object[]{context, ComInfoManager.getCommonInfo(context).boundID + “.fileProvider”, file});

if (contentUri == null) {

ELog.error("file location is " + file.toString());

ELog.error(“install failed, contentUri is null!”);

return false;

}

i.setDataAndType(contentUri, “application/vnd.android.package-archive”);

} else {

i.setDataAndType(Uri.fromFile(file), “application/vnd.android.package-archive”);

}

i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

context.startActivity(i);

调用反射方法定义如下:

public static Object invokeReflectMethod(String className, String methodName, Object instance,

Class<?>[] paramTypes, Object[] params) {

try {

Class<?> clazz = Class.forName(className);

Method method = clazz.getDeclaredMethod(methodName, paramTypes);

method.setAccessible(true);

return method.invoke(instance, params);

} catch (Exception e) {

zz = Class.forName(className);

Method method = clazz.getDeclaredMethod(methodName, paramTypes);

method.setAccessible(true);

return method.invoke(instance, params);

} catch (Exception e) {

举报

相关推荐

0 条评论