Android Universal Image Loader无法通过uri显示图像

时间:2016-08-07 20:28:32

标签: android image bitmap uri universal-image-loader

所以我的应用程序就是这样的:

在某些时候,我切换到拍摄照片的活动,获取创建的位图&url并将其传递给我的主要活动:     公共类CameraActivity扩展了AppCompatActivity {

static final int REQUEST_IMAGE_CAPTURE = 1;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
        startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
        Uri imageUri = data.getData();

        Intent mainmenu = new Intent(this, MainActivity.class);
        mainmenu.putExtra("imageUri", imageUri.toString());
        setResult(Activity.RESULT_OK, mainmenu);
        finish();
    }
}

然后在我的主要活动中,我使用新路径更新我的sqlite数据库

        switch(requestCode)
    {
        case CAMERA_RESULT:

            String imageUri = data.getStringExtra("imageUri");
            Task imageTask= tasks.get(taskImageSet);
            db.deleteTask(imageTask);
            adapter.remove(imageTask);

            imageTask.setImagePath(imageUri);

            db.addTask(imageTask);
            adapter.add(imageTask);
            adapter.notifyDataSetChanged();
            break;

(我知道这样做有点傻,但我只是试图让图片加载器工作......)

然后,当用户点击某个内容时,它会切换到另一个应该显示结果的活动:

    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.dialog_showimage);

    // UNIVERSAL IMAGE LOADER SETUP
    DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder()
            .cacheOnDisc(true).cacheInMemory(true)
            .imageScaleType(ImageScaleType.EXACTLY)
            .displayer(new FadeInBitmapDisplayer(300)).build();

    ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(
            getApplicationContext())
            .defaultDisplayImageOptions(defaultOptions)
            .memoryCache(new WeakMemoryCache())
            .discCacheSize(100 * 1024 * 1024).build();

    ImageLoader.getInstance().init(config);

    String url = getIntent().getStringExtra("url");

    Toast.makeText(this, url, Toast.LENGTH_LONG).show();

    ImageLoader imageLoader = ImageLoader.getInstance();
    DisplayImageOptions options = new DisplayImageOptions.Builder().cacheInMemory(true)
            .cacheOnDisc(true).resetViewBeforeLoading(true)
            .showImageForEmptyUri(R.drawable.at_save)
            .showImageOnFail(R.drawable.cv_fail)
            .showImageOnLoading(R.drawable.cv_loading).build();

    ImageView imageView = (ImageView) findViewById(R.id.ivTaskImage);


    imageLoader.displayImage(url, imageView, options);
}

但它没有显示cv_fail图像。

重要的是要提到我在生成位图时和显示图像之前打印了路径并且它是相同的,如下所示:

content://media/external/images/media/84443

我的清单中有以下权限:

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

您也可以使用可以从URI检索的图像的文件路径,而不是使用URI。我之所以喜欢使用文件,是因为您可以检查图像是否真的存在于您的存储中。您可以在此处检查所有接受URI:Universal Image Loader

 Uri selectedImageUri = Uri.parse(imageUri);
 String photoPath = getRealPathFromURI(selectedImageUri);

这是获取照片路径的方法

private String getRealPathFromURI(Uri uri) {
    String[] projection = { MediaStore.Images.Media.DATA };
    @SuppressWarnings("deprecation")
    Cursor cursor = managedQuery(uri, projection, null, null, null);
    int column_index = cursor
            .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
    cursor.moveToFirst();
    return cursor.getString(column_index);
}

现在您正在获得此文件的结果:///mnt/sdcard/image.png。然后你可以照常显示图像。

 imageLoader.displayImage(photoPath, imageView, options); 
 //make sure your photoPath contain this prefix: 'file:/'