应用安装
1 | import android.app.Activity; |
打开APP
1 | public static void openApp(Activity activity,String packageName){ |
应用安装卸载监听
静态注册
新建监听类:BootReceiver继承BroadcastReceiver
1 | import android.content.BroadcastReceiver; |
修改AndroidManifest.xml配置文件,添加广播介绍,添加监听的权限
1 |
|
动态注册
1 | private BootReceiver installedReceiver; |
FileProvider
Android7及以上对文件权限的管控抓的很严格。
需要在AndroidManifest.xml里面对它进行声明一个ContentProvider。
定义FileProvider
由于FileProvider提供了ContentURI的生成方法,所以我们无需在代码中定义写一个它的子类
name属性是固定的。
authorities可以自己定义,一般是包名字加上.fileprovider。
exported设置为false,因为通常是拒绝外部直接访问的。
grantUriPermissions需要为true,需要授予临时的Uri权限。
1 | <manifest> |
假如我们APP的包名是cn.psvmc.myapp,其中的android:authorities就在包名的基础上添加.fileprovider。
1 | <provider |
file_path.xml需要建立在res目录下名为xml的目录下,xml目录需要自己建立。
paths下可以包含一个或者多个子节点。
1 |
|
这个xml的作用在于为文件生成URI,
其中root-path、files-path、cache-path这些标签代表父路径:
- root-path :
File("/") - files-path :
Context.getFilesDir() - cache-path :
context.getCacheDir() - external-path :
Environment.getExternalStorageDirectory() - external-files-path :
ContextCompat.getExternalFilesDirs(context, null)[0] - external-cache-path :
ContextCompat.getExternalCacheDirs(context)[0] - external-media-path :
context.getExternalMediaDirs()[0]
path属性代表子路径,name代表为”父路径/子路径”起的名字,
1 | <files-path name="files" path="images/" /> |
路径对应关系
创建file_paths.xml文件
1 |
|
我们还可以在path中用.代替所有目录。
1 | //文件路径 |
观察我们生成的Uri示例,上边是我们普通的fileUri下边是我们生成的ContentUri,区别就在于ContentUri没有暴露具体的文件路径。
fileUri地址构成
file://+文件的全路径
ContentUri地址构成
content://+android:authorities的值/paths中匹配的名称/应用名称
例如:
1 | //普通的fileUri(通过Uri.fromFile(file)获取) |
APP的安装
1 | //文件路径 |