AndroidのContentProviderによるファイル共有
4826 ワード
ContentProviderを使用してファイルを共有する場合は、openFileメソッドを書き換える必要があります.そうしないと、例外が表示されます.
次のようになります.
uri=content://jobdispatcher/abc.txtの場合、uri.getPathとuri.getEncodedPathはともに「/abc.txt」であり、特に「/」が含まれていることに注意してください.
登録:
例:providerを提供するAPP Aは、指向性放送を送信することにより、指定したAPP Bに共有ファイルのuriを送信し、その指向性放送を受信したAPP Aはuriを介してファイルを解析する.
ブロードキャスト:
ブロードキャストの登録の受信:
指向性ブロードキャストの受信方法:
例では、共有ファイルはdata/data/ディレクトリの下に格納され、人為的な変更を防止する.もちろんsdカードのファイルを共有することもできます.ただ安全性の面では保険がかかりません.
次のようになります.
public class ContentProviderDemo extends ContentProvider {
@Override
public ParcelFileDescriptor openFile(Uri uri, String mode)
throws FileNotFoundException {
// , data/data/
String path = getContext().getFilesDir().getParent();
File file = new File(path, uri.getPath().substring(1));
// ParcelFileDescriptor.MODE_READ_ONLY:
// ParcelFileDescriptor.MODE_WRITE_ONLY:
// ParcelFileDescriptor.MODE_READ_WRITE:
return ParcelFileDescriptor.open(file,
ParcelFileDescriptor.MODE_READ_ONLY);
}
...
}
uri=content://jobdispatcher/abc.txtの場合、uri.getPathとuri.getEncodedPathはともに「/abc.txt」であり、特に「/」が含まれていることに注意してください.
登録:
例:providerを提供するAPP Aは、指向性放送を送信することにより、指定したAPP Bに共有ファイルのuriを送信し、その指向性放送を受信したAPP Aはuriを介してファイルを解析する.
ブロードキャスト:
String RECEIVE_MSG_ACTION = "com.example.sspreceiver.msg_action";
Button button1 = (Button) findViewById(R.id.button1);
button1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setAction(RECEIVE_MSG_ACTION);
Uri data = Uri.parse("msg://com.example.ssp1");
intent.setData(data);
// uri provider , put uri
intent.putExtra("uri", "content://jobdispatcher/abc.txt");
MainActivity.this.sendBroadcast(intent);
}
});
ブロードキャストの登録の受信:
指向性ブロードキャストの受信方法:
public class Ssp1Receiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String uri = intent.getStringExtra("uri");
if (uri != null) {
try {
// 1: uri
InputStream inputStream = context.getContentResolver()
.openInputStream(Uri.parse(uri));
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(inputStream));
String lineStr = null;
while ((lineStr = bufferedReader.readLine()) != null) {
System.out.println("lineStr:" + lineStr);
}
bufferedReader.close();
// 2: uri
context.getContentResolver().openOutputStream(Uri.parse(uri),
"w");
// 3:
AssetFileDescriptor descriptor = context.getContentResolver()
.openAssetFileDescriptor(Uri.parse(uri), "r");
InputStream is = descriptor.createInputStream();
// uri
int start = uri.lastIndexOf('/');
String fileName = uri.substring(start + 1);
// data/data/ /files
fileName = context.getFilesDir().getAbsolutePath() + "/"
+ fileName;
OutputStream os = new FileOutputStream(new File(fileName));
byte[] b = new byte[1024];
int len;
while ((len = is.read(b)) != -1) {
os.write(b, 0, len);
}
os.flush();
is.close();
os.close();
//
File file = new File(fileName);
if (file.isFile() && file.exists()) {
InputStreamReader reader = new InputStreamReader(
new FileInputStream(file));
BufferedReader buffered = new BufferedReader(reader);
String lineTxt = null;
while ((lineTxt = buffered.readLine()) != null) {
System.out.println("lineTxt:" + lineTxt);
}
reader.close();
buffered.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
例では、共有ファイルはdata/data/ディレクトリの下に格納され、人為的な変更を防止する.もちろんsdカードのファイルを共有することもできます.ただ安全性の面では保険がかかりません.