从Uri到Android的位图获取Google+个人资料图片
我正在使用Google+登录以获取GoogleSignInAccount的实例,并且我可以正确加载用户名和电子邮件而没有问题,所以我知道它已正确设置。然后我得到用户个人资料图片的Uri,并试图将其设置为ImageButton的图标。从Uri到Android的位图获取Google+个人资料图片
变量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转换为位图的工作代码示例。
我建议另一种方法,用ImageView
代替,那么你可以拨setOnClickListener
那ImageView
。
private void handleSignInResult(GoogleSignInResult result) {
if (result.isSuccess()) {
// Signed in successfully, show authenticated UI.
GoogleSignInAccount acct = result.getSignInAccount();
...
Uri uri = acct.getPhotoUrl();
Picasso.with(mContext)
.load(uri)
.placeholder(android.R.drawable.sym_def_app_icon)
.error(android.R.drawable.sym_def_app_icon)
.into(mProfileImageView);
// then call mProfileImageView.setOnClickListener();...
updateUI(true);
} else {
// Signed out, show unauthenticated UI.
updateUI(false);
}
}
MediaStore.Images.Media.getBitmap(this.getContentResolver(), userPhoto);
这从文件系统加载一个URI。它不会从网络加载URL。
您需要使用网络库来获取字节流(在一个线程中)并将其转换为位图。
您可以使用第三方网络库,并且还有第三方支持网络的ImageView来执行此操作。无论如何,你必须自己添加代码。
谢谢谢谢谢谢谢谢!完美工作! :D甚至不必将它制作为ImageView,Picasso也可以直接在ImageButton上使用。 :) –