打开本地html文件的方法
有些html文件放在本地磁盘和sdcard,如何用打开这个网页呢?
这种应用在测试时非常有用。
有2个方法:
1. 使用文件管理器
如ES等,需要幸运的是你的文件管理器直接用浏览器打开。
2. 在浏览器输入启凯宽地址
访问本地磁盘和SD卡上的HTML,前部分content://com.android.htmlfileprovider是Provider的标准,后面是程悄亮序目录。
比如sdcard的孙伍tesl.html
直接在浏览器里输入content://com.android.htmlfileprovider/sdcard/test.html回车就可以看到网页了。
在代码
webView.loadUrl("content://com.android.htmlfileprovider/sdcard/test.html")
如果是其它程序的私有html文件,这样做会失败。
这是由于com.android.htmlfileprovider的权限不够,如果是重写一个私有的HtmlProvider位于同一个应用中,应该能解决问题。然后就参考了原来的com.android.htmlfileprovider
源代码,改写了下。问题解决了,使用私有的HTMLProvider,可以轻松的访问手机内存中,程序私有目录下的html文件。
网上有例子,你可以搜索!
FileProvider 是安卓7.0以上版本因为谷歌官方对 StrictMode (严格模式)的开启而产生的安全机制的产物(也就是说,在7.0以下是不需要它的),它继承自 ContentProvider 。
不是。只有在你需要把文件在2个(或以上)app之间交互的时候才需要它。有人说我也没打算把我的app的数据给别的app或者需要别的app给我数据呀?其实不然,不一定其他app是指第三方app,还包括系统app,比如:系统相机拍照(让系统相机把照片保存到你指定的路径)?要不再把照片给裁剪一下( uCrop 中的 UCrop.of(xxx).start() 方坦镇法其实也是用 startActivityForResult(xxx) 方法)?检测到新版本时候再自动安装一下(把需要安装的apk包给系统安装器来安装)?
总的来说就一句话: 只要你需要把文件地址(比如: file://xxx/xx )用 Intent 传递的时候就必须用它。
简单来说就是把 file://xxx/xx 这种File格式地址改造为 Uri 格式地址 content://xxx/xx 。
那怎么改呢?很简单: Uri uri = FileProvider.getUriForFile(context,authority,file),第2个参数待会儿再讲,第3个参数就是需要被改造的File文件,这个Uri的路径格式就是上面提到的 content://xxx/xx 。
但是,在使用这个方法之前还有2个前提步骤需要先做:
简单作一下解释:
android:name :实际解析处理这个 provider 的 FileProvider ,这个一般就用系统贺盯帮我实现的 androidx.core.content.FileProvider 。不一定非要 androidx 里的, v4 包也有这种 FileProvider 。当然,你也可以自己实现一个。
android:authorities :前面提到的 .getUriForFile(xxx,authority,xxx) 就是它。作用就是用它来匹配找到对应该使用哪个 provider 的。值得注意的是,这个值在一个app中必须是唯一的,所以最好根据 ${applicationId} 来让 gradle 来自动生成。不过也不是一定要这么搞,如果这个 provider 本身就是 app 里使用,并不是作为一个 module 或 lib 来使用的话,你也可以写死。(它本质是一个字符串而已,但是很多博文禅信和都是 ${applicationId}.fileProvider ,其实大可不必,你随便写一个都行,只要在上面那个方法的第二个字段跟它一样就行。)
android:exported :是否需要公开这个 provider ? 一般我们单进程干活的app都设置为false就行
android:grantUriPermissions :是否授权这个文件给第三方。更多信息可以自行了解一下 Context.grantUriPermission(toPackage,uri,modeFlags) 这个方法
meta-data 里的 android:name :也是固定值不用动,源码里就是写死的用这个值来解析xml的
meta-data 里的 android:resource :需要自己新建一个文件 res/xml/my_file_paths.xml ,路径与文件名就是这个值。
paths 里值可以是如下几个:
上面的 name 里的 xxx 是用作生成的 Uri 格式路径的中间路径,比如: content://com.example.myapp/xxx/test1.jpg
上面的 path 里的 xxxx 是用作生成 File 格式路径的中间路径,比如:
/storage/emulated/0/Android/data/com.example.myapp/files/xxxx/test1.jpg
上面每个值后面的注释就是上面这个 File 格式对应的,比如: external-files-path 对应的 context.getExternalFilesDir(type) 获取到的值---- /storage/emulated/0/Android/data/com.example.myapp/files
也就是说,当需要传递某个文件时,你可以用以上 context.getXxxDir() 方法的路径来选择具体在 paths.xml 里写对应哪个值。还是最开始讲的那句:其目的无非就是把 File 的路径转为 Uri 来暴露给其他 app 。
好了,至此讲得差不多。
File openFile = new File(getExternalFilesDir(null), filename)//让文件可以被其他应用液仔打开
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
//设置文件额Uri
Uri fileUri = FileProvider.getUriForFile(this, getPackageName() + ".fileprovider", openFile)
intent.setDataAndType(fileUri, "application/pdf")
startActivity(intent)
}
}
//继续写代码
```
####### modify_manifest.xml
```xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.huawei.huaweiapplication">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme"
tools:ignore="GoogleAppIndexingWarning">
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"></meta-data>
</provider>
<activity android:name=".MainActivity">
<intent-filter>闹凳汪
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
```
###### create_res_file_paths.xml
```xml
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path
name="external_files"
path="."/>
</paths>
```
我把以上代码全部实现以后,就可以调起系统的pdf阅粗谨读器了,基本测试没有问题。
最后,读者可以拿这段代码再稍微修改一下,实现自己的文件调用,比如txt、gif等等,甚至可以调起系统的图片浏览器,让更多的内容能够得到支持,供给用户更好的体验。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)