需要关于混合“Uri / int id”图像环境的建议

时间:2010-02-21 20:30:17

标签: android

我有以下问题:

假设到目前为止,我正在使用R.drawable.img在某些图像视图中设置图像 与

imgView.setImage(aProduct.getImgId());

简化的产品类看起来像这样:

class Product{
        int imgId;

        ....
        public void setImgId(int id){
        this.imgId=id;
        }

        public int getImgId(){
        return this.imgId
        }

        ...




    }

我的应用程序现已“进化”,因为用户可以添加自定义产品 从相机中取出img并获得图片的Uri。 并在ImageView imgView.setImgURI(Uri)上设置图像

现在我的问题是: 什么是混合int / Uri图像资源环境的最佳方法? 我可以获得“R.drawable.img”的Uri吗?

我不确定我的问题是否清楚,我的意思是:

在设置imageview之前,我必须检查我的产品是否有Uri或int Id, 然后创建一个“if”来调用适当的方法,或者有一个更简单的解决方案?

感谢您的阅读,对不起我的英语。

问候。

1 个答案:

答案 0 :(得分:1)

您的问题是基本上有3种类型的图像资源:

  • R.id...资源:内部资源,例如您放入res文件夹的图标
  • 内容URI :本地文件或内容提供商资源,例如content://file:///sdcard/...
  • 远程文件网址:网络上的图片,例如http://...

您正在寻找一种方法来传递一个标识符,它可以处理所有三个。我的解决方案是传递字符串:URI的toString(),或只是R.id整数的字符串表示。

我正在使用以下代码来处理这个问题,并使代码能够使用它:

public static FastBitmapDrawable returnAndCacheCover(String cover, ImageRepresentedProductArtworkCreator artworkCreator) {
    Bitmap bitmap = null;
    Uri coverUri = null;
    boolean mightBeUri = false;
    //Might be a resId. Needs to be cached. //TODO: problem: resId of default cover may not survive across versions of the app.
    try {
        bitmap = BitmapFactory.decodeResource(Collectionista.getInstance().getResources(), Integer.parseInt(cover));
    } catch (NumberFormatException e) {
        //Not a resId after all.
        mightBeUri=true;
    }
    if(bitmap==null || mightBeUri){
        //Is not a resId. Might be a contentUri.
        try {
            coverUri = Uri.parse(cover);
        } catch (NullPointerException ne) {
            //Is null
            return null;
        }
    }
    if(coverUri!=null){
        if(coverUri.getScheme().equals("content")){
            //A contentUri. Needs to be cached.
            try {
                bitmap = MediaStore.Images.Media.getBitmap(Collectionista.getInstance().getContentResolver(), coverUri);
            } catch (FileNotFoundException e) {
                return null;
            } catch (IOException e) {
                return null;
            }
        }else{
            //Might be a web uri. Needs to be cached.
            bitmap = loadCoverFromWeb(cover);

        }
    }
    return new FastBitmapDrawable(bitmap);
}

您可能有兴趣接管逻辑部分。 Ofcourse cover是这里的问题字符串。

忘记android.resource://作为R.id...整数的替代。索赔正在循环不起作用:http://groups.google.com/group/android-developers/browse_thread/thread/a672d71dd7df4b2d

要了解如何实施loadCoverFromWeb,请浏览其他问题或ping我。这个网站的东西是它自己的一个领域。

(基于我的应用Collectionista中的GPLv3代码:https://code.launchpad.net/~pjv/collectionista/trunk