▼Androidメモ▼
ファイルを提供するコンテンツプロバイダの利用
ファイルを提供するコンテンツプロバイダを作成する。
ファイルシステム内のHTMLは直接WebViewから表示できないため、
コンテンツプロバイダでHTMLを公開し、それをWebViewから参照する必要がある。
![]()
リソースの準備
プロジェクトのresフォルダ内にrawフォルダを作成し、その中に「index.html」「image.gif」を追加する。
プログラム実行時にファイルシステムにコピーされる。
index.html This is TEST!<BR> <img src="image.gif">
image.gif
ソースコード
FileProviderEx.java package net.npaka.fileproviderex; import android.app.*; import android.content.*; import android.os.*; import android.view.*; import android.webkit.*; import java.io.*; //ファイルを提供するコンテンツプロバイダの利用 public class FileProviderEx extends Activity { //初期化 @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); requestWindowFeature(Window.FEATURE_NO_TITLE); //Rawリソースのファイル保存 try { raw2file(this,R.raw.index,"index.html"); raw2file(this,R.raw.image,"image.jpg"); } catch (Exception e) { } //Webビューの生成 WebView webView=new WebView(this); setContentView(webView); //コンテンツプロバイダが提供するファイルへのアクセス webView.loadUrl("content://net.npaka.fileprovider/index.html"); } //Rawリソースのファイル保存 private void raw2file(Context context, int resID,String fileName) throws Exception { InputStream in=null; String path=context.getFilesDir().getAbsolutePath()+"/"+fileName; if (!(new File(path)).exists()) { in=context.getResources().openRawResource(resID); in2file(context,in,fileName); } } //入力ストリームのファイル保存 private void in2file(Context context, InputStream in,String fileName) throws Exception { int size; byte[] w=new byte[1024]; OutputStream out=null; try { out=context.openFileOutput(fileName, Context.MODE_WORLD_READABLE); while (true) { size=in.read(w); if (size<=0) break; out.write(w,0,size); }; out.close(); in.close(); } catch (Exception e) { try { if (in !=null) in.close(); if (out!=null) out.close(); } catch (Exception e2) { } throw e; } } }
FileProvider.java package net.npaka.fileproviderex; import android.content.ContentProvider; import android.content.ContentValues; import android.database.Cursor; import android.net.Uri; import android.os.ParcelFileDescriptor; import java.io.File; import java.io.FileNotFoundException; import java.net.URI; //ファイルを提供するコンテンツプロバイダ public class FileProvider extends ContentProvider { //コンテンツプロバイダの初期化 @Override public boolean onCreate() { return true; } //ファイルの提供 @Override public ParcelFileDescriptor openFile(Uri uri,String mode) throws FileNotFoundException { File file = new File(URI.create( "file:///data/data/net.npaka.fileproviderex/files/"+ uri.getLastPathSegment())); ParcelFileDescriptor parcel= ParcelFileDescriptor.open( file,ParcelFileDescriptor.MODE_READ_ONLY); return parcel; } //データベースのクエリー命令(未使用) @Override public Cursor query(Uri uri,String[] projection,String selection, String[] selectionArgs,String sortOrder) { return null; } //データベースの挿入命令(未使用) @Override public Uri insert(Uri uri,ContentValues values) { return null; } //データベースの更新命令(未使用) @Override public int update(Uri uri,ContentValues values, String selection,String[] selectionArgs) { return 0; } //データベースの削除命令(未使用) @Override public int delete(Uri uri,String selection, String[] selectionArgs) { return 0; } //種別の取得(未使用) @Override public String getType(Uri uri) { return null; } }
AndroidManifest.xml
コンテンツプロバイダ「FileProvider」を名前「net.npaka.fileprovider」で追加。
AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="net.npaka.fileproviderex" android:versionCode="1" android:versionName="1.0.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".FileProviderEx" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <provider android:name="FileProvider" android:authorities="net.npaka.fileprovider"></provider> </application> </manifest>
コンテンツプロバイダが提供するファイルの取得方法
−戻る−