別のアプリでコンテンツ プロバイダーを介して画像を返そうとしています。私は 2 つのアプリを持っています。1 つは (アプリ a) でのアクティビティ、もう 1 つはコンテンツ プロバイダー (アプリ b) のアクティビティです。
次のコードを使用して、アプリbを介してSDカードから画像を読み取るアプリがあります。
アプリ a:
public void but_update(View view)
{
ContentResolver resolver = getContentResolver();
Uri uri = Uri.parse("content://com.jash.cp_source_two.provider/note/1");
InputStream inStream = null;
try
{
inStream = resolver.openInputStream(uri);
Bitmap bitmap = BitmapFactory.decodeStream(inStream);
image = (ImageView) findViewById(R.id.imageView1);
image.setImageBitmap(bitmap);
}
catch(FileNotFoundException e)
{
Toast.makeText(getBaseContext(), "error = "+e, Toast.LENGTH_LONG).show();
}
finally {
if (inStream != null) {
try {
inStream.close();
} catch (IOException e) {
Log.e("test", "could not close stream", e);
}
}
}
};
アプリ b:
@Override
public ParcelFileDescriptor openFile(Uri uri, String mode)
throws FileNotFoundException {
try
{
File path = new File(Environment.getExternalStorageDirectory().getAbsolutePath(),"pic2.png");
return ParcelFileDescriptor.open(path,ParcelFileDescriptor.MODE_READ_ONLY);
}
catch (FileNotFoundException e)
{
Log.i("r", "File not found");
throw new FileNotFoundException();
}
}
アプリ a では、setImageURi を使用し、次のコードを使用して URI を構築することで、アプリ a のリソース フォルダーから画像を表示できます。
int id = R.drawable.a2;
Resources resources = getBaseContext().getResources();
Uri uri = Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://" +
resources.getResourcePackageName(id) + '/' +
resources.getResourceTypeName(id) + '/' +
resources.getResourceEntryName(id) );
image = (ImageView) findViewById(R.id.imageView1);
image.setImageURI(uri);
ただし、アプリ b (SD カード上のイメージではなくアプリ b のリソース フォルダーから読み取る) で同じことを実行しようとすると、パスを作成しているにもかかわらず、ファイルが見つからないと言って機能しません。リソースからのファイルの、それは間違いなくそこにあります。
何か案は?何らかの方法で、コンテンツ プロバイダーを介したリソースの送信を制限していますか?
PSでファイルを作成しようとしたときにもエラーが発生しました
File path = new File(uri);
http://developer.android.com/reference/java/io/File.html#File(java.net.URI)可能だと思うようですが、「 (android.net.Uri)
」に適用できるコンストラクターはありません... Java. net.URI は android.net.URI とは異なります。その場合、それらを変換できますか?
ありがとう
ラス