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

Android Universal Image Loader fails to display image by uri

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

有时我会切换到 activity 来拍照,获取创建的位图 url 并将其传递到我的主 activity: public class 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();
    }
}

然后在我的主程序中 activity 我用新路径更新我的 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;

(我知道这样做有点傻,但我只是想让图像加载器正常工作...)

然后当用户点击某个东西时它会切换到另一个 activity 应该显示结果:

    @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"/>

非常感谢任何帮助!

除了使用 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:/'