Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/206.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 获取谷歌&x2B;Android上从Uri到位图的配置文件图片_Java_Android_Bitmap_Google Plus_Google Plus Signin - Fatal编程技术网

Java 获取谷歌&x2B;Android上从Uri到位图的配置文件图片

Java 获取谷歌&x2B;Android上从Uri到位图的配置文件图片,java,android,bitmap,google-plus,google-plus-signin,Java,Android,Bitmap,Google Plus,Google Plus Signin,我正在使用Google+登录获取GoogleSignInAccount的一个实例,我可以正确加载用户名和电子邮件,没有任何问题,因此我知道它设置正确。然后我得到用户配置文件图片的Uri,并试图将其设置为ImageButton的图标 变量userPhoto是从GoogleSignInAccount获取的一个android.net.Uri。为了清楚起见,该照片不在设备上 这是我现在使用的代码,但没有用: profileButton = (ImageButton) navHeaderView.find

我正在使用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)
如果我跟踪作为“未找到文件”错误抛出的链接,我会找到照片(顺便说一句):

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


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

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

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

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


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

我建议另一种方法,使用
ImageView
,然后您可以在
ImageView
上调用
setOnClickListener

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);
    }
}

谢谢谢谢谢谢!!工作得很好!:D甚至不必将其设置为ImageView,毕加索也可以直接使用ImageButtons这不是答案,而是跳到转换为位图的另一种方法。但这种方式无法将图像保存到设备内存。@Sandeep请再次阅读OP的想法“我当然可以从Uri获取照片的URL,然后将其下载到设备,但我希望不必这样做”