Android中FileProvider的各种应用场景_安卓fileprovider

包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。资料太多,全部展示会影响篇幅,暂时就先列举这些部分截图。资料太多,全部展示会影响篇幅,暂时就先列举这些部分截图。,这里放上我搜集整理的。
摘要由CSDN通过智能技术生成
val bd: BitmapDrawable = drawable as BitmapDrawable
val bitmap = bd.bitmap
FilesUtils.getInstance().saveBitmap(bitmap, "naixiao-1122.jpg")

val filePath = FilesUtils.getInstance().sdpath + "naixiao-1122.jpg"

YYLogUtils.w("文件原始路径:$filePath")

val uri = FileProvider.getUriForFile(commContext(), "com.guadou.kt_demo.fileprovider", File(filePath))

YYLogUtils.w("打印Uri:$uri")

//到系统中找打开对应的文件
openFile(filePath, uri)

}

private fun openFile(path: String, uri: Uri) {
//取得文件扩展名
val extension: String = path.substring(path.lastIndexOf(“.”) + 1)

//通过扩展名找到mimeType
val mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension)
YYLogUtils.w("mimeType: $mimeType")

try {
    //构造Intent,启动意图,交由系统处理
    startActivity(Intent().apply {
        //临时赋予读写权限
        addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
        //表示用其它应用打开
        action = Intent.ACTION_VIEW
        //给Intent 赋值
        setDataAndType(uri, mimeType)
    })
} catch (e: Exception) {
    e.printStackTrace()
    YYLogUtils.e("不能打开这种类型的文件")
}

}


很简单的一个例子,我们把drawable中的一个图片,保存到我们私有沙盒目录中,目录为


文件原始路径:/storage/emulated/0/Android/data/com.guadou.kt\_demo/cache/pos/naixiao-1122.jpg  
 我们通过 FileProvider 拿到 content://开头的uri路径。然后通过Intent匹配找到对于的第三方App来接收。  
 那么打印就如下:


打印Uri:content://com.guadou.kt\_demo.fileprovider/external\_app\_cache/pos/naixiao-1122.jpg


content 是 scheme。  
 com.guadou.kt\_demo.fileprovider 即为我们在清单文件中定义的 authorities,即是我们的FileProvider的唯一表示,在接收的时候作为host。  
 这样封装之后,当其他的App收到这个Uri就无法从这些信息得知我们的文件的真实路径,相对有安全保障。


其他场景中,比如沙盒中的Apk文件想要安装,也是一样的流程,我们需要赋予读写权限,然后设置DataAndType即可。代码的注释很详细,大家可以参考参考。


此时我们都是发送了一个Intent,让系统自己去匹配符合条件的Activity。那有没有可能我们自己做一个App去匹配它。


这… 好像还真行。


### 二、能不能自定义接收文件?


其实我们仿造系统的App的做法,我们在自定义的Activity中加入指定Filter即可,比如这里我需要接收图片,那么我定义如下的 intent-filter:





        <category android:name="android.intent.category.LAUNCHER" />

    </intent-filter>
</activity>

<activity
    android:name=".ReceiveImageActivity"
    android:exported="true">

    <intent-filter>

        <action android:name=
  • 11
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值