▼Androidメモ▼
ファイルを提供するコンテンツプロバイダの利用


ファイルを提供するコンテンツプロバイダを作成する。
 


リソースの準備
プロジェクトのresフォルダ内にrawフォルダを作成し、その中に「test.txt」を追加する。
test.txt
これはテストです。

ソースコード
FileProviderEx.java
package net.npaka.fileproviderex;
import android.app.Activity;
import android.graphics.Color;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;

//ファイルを提供するコンテンツプロバイダの利用
public class FileProviderEx extends Activity implements
View.OnClickListener {
private final static int WC=LinearLayout.LayoutParams.WRAP_CONTENT;
private final static int MP=LinearLayout.LayoutParams.MATCH_PARENT;
private final static String TAG_READ="read";
private EditText editText;

//アクティビティ起動時に呼ばれる
@Override
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
requestWindowFeature(Window.FEATURE_NO_TITLE);

//レイアウトの生成
LinearLayout layout=new LinearLayout(this);
layout.setBackgroundColor(Color.WHITE);
layout.setOrientation(LinearLayout.VERTICAL);
setContentView(layout);

//エディットテキストの生成
editText=new EditText(this);
editText.setLayoutParams(new LinearLayout.LayoutParams(MP,WC));
layout.addView(editText);

//ボタンの生成
layout.addView(makeButton("コンテンツプロバイダ通信",TAG_READ));
}

//ボタンの生成
private Button makeButton(String text,String tag) {
Button button=new Button(this);
button.setText(text);
button.setTag(tag);
button.setOnClickListener(this);
button.setLayoutParams(new LinearLayout.LayoutParams(WC,WC));
return button;
}

//ボタンクリック時に呼ばれる
public void onClick(View v) {
String tag=(String)v.getTag();
if (TAG_READ.equals(tag)) {
try {
//コンテンツプロバイダが提供するファイルへのアクセス
InputStream in=getContentResolver().openInputStream(Uri.parse(
"content://net.npaka.fileprovider/test"));
String str=new String(in2data(in));
editText.setText(str,TextView.BufferType.EDITABLE);
} catch (Exception e) {
toast("読み込み失敗しました。");
}
}
}

//入力ストリーム→データ
public static byte[] in2data(InputStream in)
throws Exception {
byte[] w=new byte[1024];
ByteArrayOutputStream out=new ByteArrayOutputStream();
try {
while (true) {
int size=in.read(w);
if (size<=0) break;
out.write(w,0,size);
};
out.close();
in.close();
return out.toByteArray();
} catch (Exception e) {
try {
if (in !=null) in.close();
if (out!=null) out.close();
} catch (Exception e2) {
}
throw e;
}
}

//トーストの表示
private void toast(String text) {
if (text==null) text="";
Toast.makeText(this,text,Toast.LENGTH_LONG).show();
}
}

FileProvider.java
package net.npaka.fileproviderex;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.ParcelFileDescriptor;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;

//ファイルを提供するコンテンツプロバイダ
public class FileProvider extends ContentProvider {
//コンテンツプロバイダの初期化
@Override
public boolean onCreate() {
return true;
}

//ファイルの提供
@Override
public ParcelFileDescriptor openFile(Uri uri,String mode)
throws FileNotFoundException {
Context context=getContext();
try {
//リソース→ファイル
String path=context.getFilesDir()+"/"+uri.getLastPathSegment();
int resID=context.getResources().getIdentifier(
uri.getLastPathSegment(),"raw",context.getPackageName());
in2file(context.getResources().openRawResource(resID),path);

//パーセルオブジェクトの生成
return ParcelFileDescriptor.open(new File(path),
ParcelFileDescriptor.MODE_READ_ONLY);
} catch (Exception e) {
}
return null;
}

//データベースのクエリー命令(未使用)
@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;
}

//入力ストリーム→ファイル
private static void in2file(InputStream in,String path)
throws Exception {
byte[] w=new byte[1024];
FileOutputStream out=null;
try {
out=new FileOutputStream(path);
while (true) {
int 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;
}
}
}

AndroidManifest.xml
AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="net.npaka.fileproviderex"
android:versionCode="1"
android:versionName="1.0">

<uses-sdk android:minSdkVersion="13" android:targetSdkVersion="16" />

<application android:label="@string/app_name"
android:icon="@drawable/ic_launcher"
android:theme="@style/AppTheme">
<activity
android:label="@string/app_name"
android:name=".FileProviderEx" >
<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"
android:exported="false">
</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"));




−戻る−