android浏览器打开本地html文件的方法有哪些?

android浏览器打开本地html文件的方法有哪些?,第1张

android 浏览器

打开本地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等等,甚至可以调起系统的图片浏览器,让更多的内容能够得到支持,供给用户更好的体验。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/8155523.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-13
下一篇 2023-04-13

发表评论

登录后才能评论

评论列表(0条)

保存