1

別のアプリでコンテンツ プロバイダーを介して画像を返そうとしています。私は 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 とは異なります。その場合、それらを変換できますか?

ありがとう

ラス

4

1 に答える 1

0

android.net.URI が存在しません。android.net.Uri があります (スペルに注意してください)。これは、java.net.URI と同じではありません。おそらく、Uri を文字列に変換してから URI に変換できます。

そのため、SD カードのファイルを開くことができ (またはそう主張します)、メインのアクティビティに画像を設定できます (またはそう主張します)。コンテンツ プロバイダーから画像などを取得しているようには見えませんか?

コンテンツ プロバイダーはデータを格納します。アセット ファイルのファイル記述子を含むファイル (つまり、ファイル記述子) を返すことができますが、アプリケーションのリソースとは関係ありません。

于 2012-11-20T01:35:27.630 に答える