从 google play 服务 api 调用个人资料图片 url 时发生错误

Posted

技术标签:

【中文标题】从 google play 服务 api 调用个人资料图片 url 时发生错误【英文标题】:Error occured while calling profile image url from google play service api 【发布时间】:2014-01-06 14:15:14 【问题描述】:

我想使用 google play service api 获取 google plus 个人资料图片。 我使用了 ImageManager.loadImage。

但我遇到了错误。 检查here。

这个错误已修复,但我已经修复了。

我的代码是这样的...

ImageManager im = ImageManager.create(getApplicationContext());                 
im.loadImage(new ImageManager.OnImageLoadedListener()
@Override
public void onImageLoaded(Uri uri, Drawable drawable)
    Log.i("TAG", "please....");
, getGamesClient().getCurrentPlayer().getIconImageUri());

我的错误报告是这样的。

12-18 20:38:07.505: E/androidRuntime(15150): FATAL EXCEPTION: main
12-18 20:38:07.505: E/AndroidRuntime(15150): java.lang.RuntimeException: Unable to start receiver com.google.android.gms.common.images.ImageBroadcastReceiver: android.os.BadParcelableException: ClassNotFoundException when unmarshalling: com.google.android.gms.common.images.ImageManager$b
12-18 20:38:07.505: E/AndroidRuntime(15150):    at android.app.ActivityThread.handleReceiver(ActivityThread.java:2244)
12-18 20:38:07.505: E/AndroidRuntime(15150):    at android.app.ActivityThread.access$1500(ActivityThread.java:138)
12-18 20:38:07.505: E/AndroidRuntime(15150):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1279)
12-18 20:38:07.505: E/AndroidRuntime(15150):    at android.os.Handler.dispatchMessage(Handler.java:99)
12-18 20:38:07.505: E/AndroidRuntime(15150):    at android.os.Looper.loop(Looper.java:137)
12-18 20:38:07.505: E/AndroidRuntime(15150):    at android.app.ActivityThread.main(ActivityThread.java:4870)
12-18 20:38:07.505: E/AndroidRuntime(15150):    at java.lang.reflect.Method.invokeNative(Native Method)
12-18 20:38:07.505: E/AndroidRuntime(15150):    at java.lang.reflect.Method.invoke(Method.java:511)
12-18 20:38:07.505: E/AndroidRuntime(15150):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
12-18 20:38:07.505: E/AndroidRuntime(15150):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)
12-18 20:38:07.505: E/AndroidRuntime(15150):    at dalvik.system.NativeStart.main(Native Method)
12-18 20:38:07.505: E/AndroidRuntime(15150): Caused by: android.os.BadParcelableException: ClassNotFoundException when unmarshalling: com.google.android.gms.common.images.ImageManager$b
12-18 20:38:07.505: E/AndroidRuntime(15150):    at android.os.Parcel.readParcelable(Parcel.java:2077)
12-18 20:38:07.505: E/AndroidRuntime(15150):    at android.os.Parcel.readValue(Parcel.java:1965)
12-18 20:38:07.505: E/AndroidRuntime(15150):    at android.os.Parcel.readMapInternal(Parcel.java:2226)
12-18 20:38:07.505: E/AndroidRuntime(15150):    at android.os.Bundle.unparcel(Bundle.java:223)
12-18 20:38:07.505: E/AndroidRuntime(15150):    at android.os.Bundle.getParcelable(Bundle.java:1165)
12-18 20:38:07.505: E/AndroidRuntime(15150):    at android.content.Intent.getParcelableExtra(Intent.java:4226)
12-18 20:38:07.505: E/AndroidRuntime(15150):    at com.google.android.gms.common.images.ImageBroadcastReceiver.onReceive(SourceFile:21)
12-18 20:38:07.505: E/AndroidRuntime(15150):    at android.app.ActivityThread.handleReceiver(ActivityThread.java:2237)
12-18 20:38:07.505: E/AndroidRuntime(15150):    ... 10 more

【问题讨论】:

谢谢卡拉。我真的很感谢你的教导。 【参考方案1】:

我在我的项目中使用此代码

ImageView player1IV = (ImageView) findViewById(R.id.iv_player_1_fs);
    ImageView player2IV = (ImageView) findViewById(R.id.iv_player_2_fs);
    TextView p1Name = (TextView) findViewById(R.id.tv_player_1_fs);
    TextView p2Name = (TextView) findViewById(R.id.tv_player_2_fs);

    ImageManager imageManager = ImageManager.create(getApplicationContext());
    if (mRoomId != null) 
        MyLog.printLog("mRoomId :" + mRoomId + getGamesClient().toString());
        for (Participant p : mParticipants) 
            String pid = p.getParticipantId();

            if (pid.equals(mMyId)) 
                MyLog.printLog("p.getIconImageUri()) :" + p.getIconImageUri());
                MyLog.printLog("p.getHiResImageUri() :" + p.getHiResImageUri());

                imageManager.loadImage(player1IV, p.getIconImageUri(), R.drawable.stub);
                p1Name.setText(p.getDisplayName());

                continue;
             else 
                imageManager.loadImage(player2IV, p.getIconImageUri(), R.drawable.stub);
                p2Name.setText(p.getDisplayName());
            
        
     else 
        // load image
        try 
            InputStream inputStream = getAssets().open("pp/" + mRoboticPlayer.getName() + ".jpg");
            Drawable d = Drawable.createFromStream(inputStream, null);
            player2IV.setImageDrawable(d);
         catch (Exception e) 
            e.printStackTrace();
            imageManager.loadImage(player2IV, R.drawable.stub);
        
        p2Name.setText(mRoboticPlayer.getName());

    

【讨论】:

感谢您的帮助。但我仍然有同样的问题。我的 p.getIconImageUri 值是“content://com.google.android.gms.games.background/images/33407107/22”。是这样吗? 我现在确实解决了这个问题。你的代码工作得很好。谢谢贾廷 对不起贾廷马尔瓦尔。我的名声太低了。我如何接受你的回答? 您只需点击左侧右侧空白按钮即可接受。【参考方案2】:

这看起来像是 Proguard 问题。 Google Play 游戏库被混淆了,所以它在运行时找不到必要的类。尝试将 AndroidManifest.xml 上的目标 API 级别设置为 17 或更高(这会改变 Proguard 的行为)并查看是否可以解决问题:

<uses-sdk android:minSdkVersion="9"
      android:targetSdkVersion="17" />

【讨论】:

@Bruno 这个功能根本不起作用,请修复它。我知道您从事 Google 游戏框架的工作。

以上是关于从 google play 服务 api 调用个人资料图片 url 时发生错误的主要内容,如果未能解决你的问题,请参考以下文章

无法登录 google play 游戏服务 API

从片段调用 Google Play 游戏服务

使用 Google Play Developer API 进行服务器端授权?

错误:用于调用 Google Play Developer API 的项目 ID 尚未在 Google Play Developer Console 中链接

在 Eclipse 中使用来自 Google Play 服务的选择性 API

限制 Google Play Games API 调用