質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

6829閲覧

Android WebView に 端末内のHTMLファイルを読み込ませたい

gah2s

総合スコア9

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2021/07/31 16:12

前提・実現したいこと

アプリ内部のAsset、アプリ専用のフォルダを使わずに、端末内のHtmlファイルを Webview で開きたいです。
どのような手段で開けるでしょうか..

方法と参考になる情報や、サイトを紹介してくださると助かります。

#####ファイル構成
これを開きたい: /storage/emulated/0/folder/index.html
同じフォルダにある画像: /storage/emulated/0/folder/icon.png

index.html

html

1<html> 2 <body> 3 <!-- 画像も表示したい --> 4 <img src="icon.png" /> 5 <img src="file:///storage/emulated/0/folder/icon.png" /> 6 </body> 7</html>
Webview の設定

java

1 WebView wv; 2 WebSettings wvconfig; 3 4//(省略) 5 6 wv = (WebView) findViewById(R.id.fullWebView); 7 wvconfig = wv.getSettings(); 8 9 wvconfig.setAllowFileAccess(true); 10 wvconfig.setAllowContentAccess(true); 11 wvconfig.setAllowFileAccessFromFileURLs(true); 12 wvconfig.setAllowUniversalAccessFromFileURLs(true); 13 14 wv.loadUrl("file:///storage/emulated/0/folder/index.html");
Manifest 権限

xml

1<?xml version="1.0" encoding="utf-8"?> 2<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.abc.def"> 3 4 <uses-permission android:name="android.permission.INTERNET" /> 5 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 6 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 7 <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" /> 8 9<!--省略--> 10 11</manifest>

発生している問題・エラーメッセージ

ストレージ権限を許可して、file:// を追加して読み込めるのかと思ったのですが、以下のエラーが Webview に表示されます。

text

1ウェブページへのアクセス不可 2ウェブページ(file:///storage/emulated/0/folder/index.html)は次の理由で読み込めませんでした: 3 4net::ERR_ACCESS_DENIED

該当のソースコード

java

1 wvconfig.setAllowFileAccess(true); 2 wvconfig.setAllowContentAccess(true); 3 wvconfig.setAllowFileAccessFromFileURLs(true); 4 wvconfig.setAllowUniversalAccessFromFileURLs(true); 5 6 wv.loadUrl("file:///storage/emulated/0/folder/index.html");

試したこと

マニフェストにインターネット、ストレージの権限を追記。
上の権限を付与した。
コンフィグで、 setAllowFileAccess, setAllowContentAccess などを true に設定した。
wv.getSettings().~~~ でも試した。
コンソールで確認したら true にすべてなっていた。

補足情報(FW/ツールのバージョンなど)

Android Studio で開発しています。
OS: Android 10 (Xperia)
エミュレータではなく 実機でテストしています。

やはり、ContentProviderMediaStore あたりを参考にしたほうがいいのでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gah2s

2021/07/31 17:46

夜遅くありがとうございます。参考になります。 /data/user/0/~~~ は アプリにしかアクセスできない領域で、できれば、だれでもアクセスができるフォルダーのhtmlを読み込めるようにしたいので、いろいろまた試行錯誤してみます。
guest

回答1

0

自己解決

自己解決しましたが、自分でも忘れそうなのでしっかり残します。

まずつまずいた点は、file:///storage/emulated/0/folder/index.html のようなアプリ専用のフォルダー外のHtmlを読み込むことでした。

いろいろな解決策を手当たり次第ggってました。

読み込むことができない原因

アクセス権を持っていない状態で、ファイルにアクセスしようとしたことだと思います。。
(Android Nくらいからセキュリティー上がったらしい。)

どのように解決したか

1. 他のアプリのManifest をまず覗いた。

そしたら、それっぽい FileProvider を見つけた。
(FileProvider? ナニコレ?)

2. android:requestLegacyExternalStorage="true" 使ってみた。

wv.loadUrl("file:///storage/emulated/0/folder/index.html")で普通に開けた。

xml

1<application ... 2 android:requestLegacyExternalStorage="true">

しかし、requestLegacyExternalStorageを使っている開発者は全体の 2% らしい。少ない!(できれば使いたくないし API30(R) 以降で使えない)
でもこれで、アクセス権限関連の問題であることを確信しました。

3. FileProvider を使ってみた。

初心者の私には、荷が重かったので、サンプルコードからコピペしたりちょっと変えたりして、下のような環境になりました。

Manifestに FileProvider用のxmlを追記

xml

1 <provider 2 android:name="androidx.core.content.FileProvider" 3 android:authorities="${applicationId}.fileprovider" 4 android:exported="false" 5 android:grantUriPermissions="true"> 6 <meta-data 7 android:name="android.support.FILE_PROVIDER_PATHS" 8 android:resource="@xml/provider_path"/> 9 </provider> 10 </application> 11 </manifest>
xml/provider_path.xml

xml

1<?xml version="1.0" encoding="utf-8"?> 2<paths xmlns:android="http://schemas.android.com/apk/res/android"> 3 <external-path 4 name="external_files" 5 path="." /> 6</paths>
java

java

1 Uri uri = FileProvider.getUriForFile(this, 2 getApplicationContext().getPackageName() + ".fileprovider", 3 new File("/storage/emulated/0/folder/index.html")); 4 5 wv.loadUrl(uri.toString());

自分の場合はこれで解決しました。
他のバージョンで試していないので、また読み込めなくなるかもしれません。

FileProvider...覚えておこう...

投稿2021/08/01 03:26

gah2s

総合スコア9

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問