通过Uri加载本地图片的Glide方法。

51

我正在尝试使用Glide从本地存储加载图像,但没有成功。

Glide.with(mContext)
    .load(pictureUri) // Uri of the picture
    .transform(new CircleTransform(..))
    .into(profileAvatar);

我收到的错误信息如下:

java.lang.Exception: Failed to load model: '/storage/emulated/0/DCIM/Camera/IMG_20150831_180900.jpg'
at com.bumptech.glide.request.GenericRequest.onSizeReady(GenericRequest.java:441)
at com.bumptech.glide.request.target.ViewTarget$SizeDeterminer.getSize(ViewTarget.java:211)
at com.bumptech.glide.request.target.ViewTarget.getSize(ViewTarget.java:100)
at com.bumptech.glide.request.GenericRequest.begin(GenericRequest.java:272)
at com.bumptech.glide.manager.RequestTracker.resumeRequests(RequestTracker.java:83)
at com.bumptech.glide.RequestManager.resumeRequests(RequestManager.java:180)
at com.bumptech.glide.RequestManager.onStart(RequestManager.java:203)
at com.bumptech.glide.manager.ActivityFragmentLifecycle.onStart(ActivityFragmentLifecycle.java:50)
at com.bumptech.glide.manager.SupportRequestManagerFragment.onStart(SupportRequestManagerFragment.java:135)
at android.support.v4.app.Fragment.performStart(Fragment.java:1986)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1051)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1197)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1179)
at android.support.v4.app.FragmentManagerImpl.dispatchStart(FragmentManager.java:1996)
at android.support.v4.app.FragmentController.dispatchStart(FragmentController.java:176)
at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:517)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1236)
at android.app.Activity.performStart(Activity.java:6006)
at android.app.Activity.performRestart(Activity.java:6063)
at android.app.Activity.performResume(Activity.java:6068)
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2975)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3017)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1347)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

请问您能否检查一下这个链接 https://github.com/bumptech/glide/issues/155? - Somasundaram NP
我已经尝试过了,但并没有发现它有多大用处。检查我的答案...如果你创建一个指向Uri位置的File实例,它就可以工作。这很奇怪。 - Tudor Luca
我认为你已经得到了解决方案,但这里是了解如何最好地使用Glide的链接。http://stackoverflow.com/a/39336438/3636561 - Abdul Rizwan
请确保您已将 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 添加到清单中,并且如果您的 targetSdk >= 23,还进行了运行时权限检查。添加这些内容解决了我的问题。 - netimen
6个回答

121

在等待某人回应的同时,我尝试从Uri创建一个File实例并加载它。 它奏效了! 奇怪!

Glide.with(mContext)
    .load(new File(pictureUri.getPath())) // Uri of the picture
    .transform(new CircleTransform(..))
    .into(profileAvatar);

它可以工作,但头像从资产文件夹中加载时会有一些小延迟。 - Yaroslav Dukal

14
如果您传递一个Uri实例,它最好是符合规范的,看起来您的实例没有模式(file://)。您可以检查如何加载UriStringFile模型以解决奇怪的问题 :)

3
为了更进一步混淆Android内置的陷阱以防止无效编码,当您在程序中使用内置的图像选择器时,它会返回一个字符串“content://......”,但该字符串无法被FileInputStream或File读取。而Bitmapfactory.loadFile(uri)则会去掉其中的一个斜杠并导致filenotfoundexception异常,因为该字符串被Bitmapfactory转换为“content:/……”,即只有一个斜杠。 看到操作系统中出现这样的愚蠢问题真是令人悲哀。 - carl

11

如果它是一个文件路径,可以直接传递。已在 Glide 4.8.0 中进行测试。

 Glide.with(context)
  .load(pictureUri.getPath())
  .transform(new CircleTransform(..))
  .into(profileAvatar);

6

请确保 Uri 来自文件。

Uri photoUri = Uri.fromFile( new File( preferences.getPhotoUrl()));

Glide.with(this).load( photoUri).into( civUserProfilePhoto);

6

在我的情况下,我在 Android 10 上运行模拟器,由于安全原因,遗留的外部存储访问默认情况下是禁用的,因此我在Androidmanifest文件中添加了以下代码。

<application android:requestLegacyExternalStorage="true" 
.....
.....

</application>

确保已经添加了读写外部存储器的用户权限。


-1

我尝试了一下,没有创建文件对象,它可以正常工作。

public static void setImageUrlFromUri(ImageView imageView, String imageUrl) {
        if (!TextUtils.isEmpty(imageUrl)) {
            Glide.with(imageView.getContext())
                    .load(imageUrl)
                    .into(imageView);
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接