1

我正在尝试通过单独应用程序中的内容提供程序传回图像。我有两个应用程序,一个带有(app a)中的活动,另一个带有内容提供者(app b)

我有应用程序 a 使用以下代码通过应用程序 b 从我的 SD 卡中读取图像。

应用程序:

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 中,我可以显示应用程序 a 的资源文件夹中的图像,使用 setImageURi 并使用以下代码构造 URI。

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 中执行相同操作(从应用程序 b 的资源文件夹而不是 SD 卡上的图像读取)它不起作用,说它找不到文件,即使我正在创建路径来自资源的文件,所以它肯定在那里。

有任何想法吗?它是否以某种方式限制通过内容提供者发送资源?

PS当我尝试创建文件时,我也遇到了错误

File path = new File(uri);说'没有适用的构造函数(android.net.Uri)'虽然http://developer.android.com/reference/java/io/File.html#File(java.net.URI)似乎认为这是可能的......除非java。 net.URI 与 android.net.URI 不同,在这种情况下我可以转换它们吗?

谢谢

拉斯

4

1 回答 1

0

android.net.URI 不存在。有一个 android.net.Uri(注意拼写)。这与 java.net.URI 不同。您可能可以将 Uri 转换为 String,然后再转换为 URI。

因此,您可以在 SD 卡上打开文件(或者您声称),并且可以在主 Activity 中设置图像(或者您声称)。我没有看到您从内容提供商那里取回图像或其他任何内容?

内容提供者存储数据。它可以返回文件(即文件描述符),包括资产文件的文件描述符,但它与应用程序中的资源无关。

于 2012-11-20T01:35:27.630 回答