FileProvider与apk下载

2024-05-27 05:28
文章标签 下载 apk fileprovider

本文主要是介绍FileProvider与apk下载,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

指定目录存放一个apk下载

我们这次把某个apk放在storage下的一个目录下,用一个FileProvider生成uri后,启动一个活动去安装。

首先用apk所在的path生成一个uri。

String external_path = Environment.getExternalStorageDirectory().getPath();String apk_path = external_path + File.separator + "Android/data/com.youku.com/aiclk_down" + File.separator + "baidusearch_AndroidPhone_1037068k.apk";File apkFile = new File(apk_path);
// 生成uri
Uri apkUri = getUri(context, apkFile);
// 通过uri安装
installApk(apkUri, context);

这里需要注意,external_path是storage/emulated/0这个目录,这个目录直接写入文件似乎是不可以的(创建文件夹可以),因此我们把apk存放在storage/emulated/0的子目录下,确保不发生权限问题。

生成uri:

    private static Uri getUri(Context context, File file) {if (file == null) {return null;}Uri uri = null;if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {uri = CPCFileProvider.getUriForFile(context, context.getPackageName() + ".CPCFileProvider", file);} else {uri = Uri.fromFile(file);}return uri;}

我们这里自定义了一个FileProvider,单纯继承自安卓提供的基类

android.support.v4.content.FileProvider

注意在获取uri的时候,第二个参数的内容需要与external-path里定义的内容相同。

<external-path name="external_files" path="."/>

 下载apk:

    private static void installApk(Uri apkUri, Context context) {Intent intent = new Intent(Intent.ACTION_VIEW);intent.setDataAndType(apkUri, "application/vnd.android.package-archive");intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);context.startActivity(intent);}

下载apk需要通过启动一个activity实现,因为高版本的andorid系统要求安装app需要显式得到用户同意。

这里需要注意intent.addFlags可以为一个intent添加多个flag属性。但是setFlags会只保留一个flag属性,建议以后只使用addFlags,避免某些属性被setFlags冲掉。

指定目录写一个txt文件并读出

给一个文件写入字符串的方法,与provider无关:

    private static void writeText(File file, String content) {if (TextUtils.isEmpty(content)) {return;}OutputStreamWriter osw = null;try {osw = new OutputStreamWriter(new FileOutputStream(file, false), StandardCharsets.UTF_8);osw.write(content);osw.flush();} catch (Exception e) {e.printStackTrace();} finally {if (osw != null) {try {osw.close();} catch (Exception e) {e.printStackTrace();}}}}

通过uri读取一个文件里的字符串:

    private static void readText(Uri fileUri, Context context) {try {InputStream inputStream = context.getContentResolver().openInputStream(fileUri);BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));StringBuilder content = new StringBuilder();String line;while ((line = reader.readLine()) != null) {content.append(line);content.append("\n"); // 如果需要逐行读取,则添加换行符}// 使用读取的内容进行处理String fileContent = content.toString();// 关闭 BufferedReader 和 InputStreamreader.close();inputStream.close();} catch (IOException e) {e.printStackTrace();}}

 可能需要创建文件夹:

    private static void createFolder() {String folderName = "aiclk_down";File folder = new File(Environment.getExternalStorageDirectory(), "Android/data/com.youku.phone/" + folderName);if (!folder.exists()) {boolean success = folder.mkdirs();if (success) {// 文件夹创建成功} else {// 文件夹创建失败}}}

知道各个子功能的实现后,就可以组装下代码了。思路就是创建文件->写入内容->读取内容。只是在读取的时候是用FileProvider生成的uri读取的。 

    public static void writeFileToExternalPath(Context context) {if (context == null) {return;}createFolder();String external_path = Environment.getExternalStorageDirectory().getPath();// 设定目标路径与文件名称 String targetPath = external_path + File.separator + "Android/data/com.youku.phone/aiclk_down" + File.separator +"test.txt";File file = new File(targetPath);try {if (!file.exists()) {// 创建文件 file.createNewFile();}// 给文件写入字符串writeText(file, "测试");} catch (Exception e) {e.printStackTrace();}//  通过provider生成uriUri uri = getUri(context, file);// 读取目标文件夹的字符串readText(uri, context);}

从两个程序中可以看出,uri是对绝对路径的再封装,提升了安全性。

这篇关于FileProvider与apk下载的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1006607

相关文章

常用的jdk下载地址

jdk下载地址 安装方式可以看之前的博客: mac安装jdk oracle 版本:https://www.oracle.com/java/technologies/downloads/ Eclipse Temurin版本:https://adoptium.net/zh-CN/temurin/releases/ 阿里版本: github:https://github.com/

2. 下载rknn-toolkit2项目

官网链接: https://github.com/airockchip/rknn-toolkit2 安装好git:[[1. Git的安装]] 下载项目: git clone https://github.com/airockchip/rknn-toolkit2.git 或者直接去github下载压缩文件,解压即可。

前端form表单+ifarme方式实现大文件下载

// main.jsimport Vue from 'vue';import App from './App.vue';import { downloadTokenFile } from '@/path/to/your/function'; // 替换为您的函数路径// 将 downloadTokenFile 添加到 Vue 原型上Vue.prototype.$downloadTokenF

【干货分享】基于SSM的体育场管理系统的开题报告(附源码下载地址)

中秋送好礼 中秋佳节将至,祝福大家中秋快乐,阖家幸福。本期免费分享毕业设计作品:《基于SSM的体育场管理系统》。 基于SSM的体育场管理系统的开题报告 一、课题背景与意义 随着全民健身理念的深入人心,体育场已成为广大师生和社区居民进行体育锻炼的重要场所。然而,传统的体育场管理方式存在诸多问题,如资源分配不均、预约流程繁琐、数据统计不准确等,严重影响了体育场的使用效率和用户体验。

Tomcat下载压缩包解压后应有如下文件结构

1、bin:存放启动和关闭Tomcat的命令的路径。 2、conf:存放Tomcat的配置,所有的Tomcat的配置都在该路径下设置。 3、lib:存放Tomcat服务器的核心类库(JAR文件),如果需要扩展Tomcat功能,也可将第三方类库复制到该路径下。 4、logs:这是一个空路径,该路径用于保存Tomcat每次运行后产生的日志。 5、temp:保存Web应用运行过程中生成的临时文件

下载/保存/读取 文件,并转成流输出

最近对文件的操作又熟悉了下;现在记载下来:学习在于 坚持!!!不以细小而不为。 实现的是:文件的下载、文件的保存到SD卡、文件的读取输出String 类型、最后是文件转换成流输出;一整套够用了; 重点: 1:   操作网络要记得开线程; 2:更新网络获取的数据 切记用Handler机制; 3:注意代码的可读性(这里面只是保存到SD卡,在项目中切记要对SD卡的有无做判断,然后再获取路径!)

最新OpenStreetMap POI数据(附下载教程)

OSM(OpenStreetMap)POI(Point of Interest)数据是指在OpenStreetMap上标记的各种兴趣点,如餐馆、酒店、公交站、学校等地点。这些数据在地理信息系统(GIS)应用中非常有用,可以帮助进行地图绘制、路径规划以及其他地理分析任务。 这里直接放出下载地址,有需要的可以自行下载,tips:国外城市的数据源质量比国内的要高一些; OpenStreetMap P

PrestaShop免费模块/插件/扩展/工具下载

PrestaShop免费模块/插件/扩展/工具下载 PrestaShop免费模块 适用于您的电子商务网站的PrestaShop模块 现有超过3,000个PrestaShop模块可帮助您自定义在线商店,增加流量,提高转化率并建立客户忠诚度。 使您的电子商务网站成功! 下载(超过142+之多的PrestaShop官网认证的免费模块) 标签PrestaShop免费, PrestaShop免费工

uniapp小程序下载缓存服务器上的图片

1. 使用uni.downloadFile,但是注意下载图片的地址里的域名,需要在微信公众平台里面的downloadFile合法域名进行配置。 export default function downloadAndCacheImage(imageUrl, name) {return new Promise((resolve, reject) => {console.log("imageUrl",

内置带so的APK为系统APK方法

(1)若内置为可卸载的APK,可以无需解压出lib直接编译就可以 具体参考http://blog.csdn.net/a462533587/article/details/46380795 (2)若内置为system APP,上述blog也有两种方式: 方法一:   如下例,在Android.mk中添加并配置变量(注意路径对应): LOCAL_PREBUILT_JNI_LIBS = \