java - 将 Google+ 个人资料图片从 Uri 获取到 Android 上的位图

标签 java android bitmap google-plus google-plus-signin

我正在使用 Google+ 登录来获取 GoogleSignInAccount 的实例,我可以正确加载用户名和电子邮件而不会出现问题,所以我知道它已正确设置。然后我获取用户个人资料图片的 Uri,并尝试将其设置为 ImageButton 的图标。

变量 userPhoto 是从 GoogleSignInAccount 抓取的 android.net.Uri。为清楚起见,照片不在设备上。

这是我现在正在使用但无济于事的代码:

profileButton = (ImageButton) navHeaderView.findViewById(R.id.navHeaderMainImageButton);

    try {
        Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), userPhoto);
        profileButton.setImageBitmap(bitmap);
    } catch (IOException e) {
        e.printStackTrace();
    }

这是我得到的错误:

    W/System.err: java.io.FileNotFoundException: No content provider: https://lh5.googleusercontent.com/-s7XGuonbDRk/AAAAAAAAAAI/AAAAAAAAFv8/htGjmtY1xD8/photo.jpg
    W/System.err:     at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1117)
    W/System.err:     at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:970)
    W/System.err:     at android.content.ContentResolver.openInputStream(ContentResolver.java:695)
    W/System.err:     at android.provider.MediaStore$Images$Media.getBitmap(MediaStore.java:859)
    W/System.err:     at com.seranth.sertutor.MainActivity.onCreate(MainActivity.java:136)
    W/System.err:     at android.app.Activity.performCreate(Activity.java:6500)
    W/System.err:     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1120)
    W/System.err:     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3072)
    W/System.err:     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3218)
    W/System.err:     at android.app.ActivityThread.access$1000(ActivityThread.java:198)
    W/System.err:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1676)
    W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:102)
    W/System.err:     at android.os.Looper.loop(Looper.java:145)
    W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:6837)
    W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
    W/System.err:     at java.lang.reflect.Method.invoke(Method.java:372)
    W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404)
    W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)
    W/Resources: Converting to string: TypedValue{t=0x5/d=0x3801 a=1 r=0x10500d1}
    W/OpenGLRenderer: Program(5ea33b00) : invalid binary - source difference(vs(201:201)/fs(94:36705)-b0000000800000000)

如果我点击因找不到文件而抛出的错误链接,我会找到照片(顺便说一句,这就是我):https://lh5.googleusercontent.com/-s7XGuonbDRk/AAAAAAAAAAI/AAAAAAAAFv8/htGjmtY1xD8/photo.jpg

所以现在的问题是,为什么上面的代码不起作用,还有另一种从 Uri 获取位图的方法吗?

我当然可以从 Uri 获取照片的 URL,然后将其下载到设备,但我希望不必这样做。如果这是您所知道的唯一解决方案,那么请提供有关如何下载 URL 文件以及如何将下载的 URL 转换为位图的工作代码示例。

最佳答案

MediaStore.Images.Media.getBitmap(this.getContentResolver(), userPhoto);

这从文件系统加载一个 URI。它不会从网络加载 URL。

您需要使用网络库来获取字节流(在线程中)并将其转换为位图。

您可以使用第三方网络库,也可以使用第三方网络启用的 ImageViews 来执行此操作。无论如何,您都必须自己添加代码。

关于java - 将 Google+ 个人资料图片从 Uri 获取到 Android 上的位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36781830/

相关文章:

java - 如何阻止 Jframe 窃取键盘输入

java - SWT - 更改列宽而不更改表宽度

java - 安装 WAR 后,前 2 次调用特定方法时出现 IBM WAS 9 错误,然后在第三次调用和所有后续调用中运行良好

java - 试图缩小 Android 中的位图不起作用

c++ - 在字符位图中切换一点

java - 如何在 Android 应用程序中存储用于多个 Activity 的位图

java - 使用 JWT 的基于角色的 Rest-API

java - 如何从github项目中获取jar?

java - WebView 中的图像未加载

android - 在 map 框中进行离线导航