▼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> 


コンテンツプロバイダが提供するファイルの取得方法
種別 利用例
WebView webView.loadUrl("content://net.npaka.fileprovider/index.html")
ImageView imageView.setImageURI(Uri.parse("content://net.npaka.fileprovider/image.jpg"));
InputStream InputStream in=getContext().getContentResolver().
openInputStream(Uri.parse( "content://net.npaka.fileprovider/image.jpg"));




−戻る−