Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/223.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
android-使用可在内容提供商中绘制的资源_Android_Android Contentprovider_Android Resources - Fatal编程技术网

android-使用可在内容提供商中绘制的资源

android-使用可在内容提供商中绘制的资源,android,android-contentprovider,android-resources,Android,Android Contentprovider,Android Resources,我试图通过一个单独的应用程序中的内容提供商传回一个图像。我有两个应用程序,一个应用程序中有活动(应用程序a),另一个应用程序中有内容提供商(应用程序b) 我让应用程序a使用以下代码通过应用程序b读取SD卡上的图像 int id = R.drawable.a2; Resources resources = getBaseContext().getResources(); Uri uri = Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "

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

我让应用程序a使用以下代码通过应用程序b读取SD卡上的图像

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);
应用程序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显示应用程序a的资源文件夹中的图像,并使用以下代码构造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卡上的图像中读取),它将不起作用,说它找不到文件,即使我正在从资源中创建文件的路径,所以它肯定在那里

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

另外,我在尝试使用创建文件时也遇到了一个错误

文件路径=新文件(uri)
说“没有适用于”
(android.net.Uri)
”虽然似乎认为这是可能的……除非java.net.Uri与android.net.Uri不同,在这种情况下我可以转换它们吗

谢谢


Russ

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

因此,您可以在SD卡上打开一个文件(或者您声称的),并且您可以在主要活动中设置一个映像(或者您声称的)。我看不出你从内容提供商那里得到了图像或其他任何东西


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

Ok,所以我没有包含调用和使用我在开始粘贴的内容提供程序的代码。我在上面添加了它。你是说我不能将资源中的图像传回内容提供商吗?(所有这些都是通过包裹描述符实现的)?ParcelFileDescriptor和AssetFileDescriptor之间有什么区别?我很乐意将我的图像放在assets文件夹中,但我认为资源是它们的首选位置?我在示例中提到的资源都在我的主应用程序中,但我想使用content provider应用程序中的resources文件夹,如果不清楚的话,很抱歉