web-dev-qa-db-ja.com

Facebook Android SDK&Java.lang.NullPointerException

https://developers.facebook.com/docs/Android/getting-started/に投稿されたチュートリアルに従って、AndroidアプリでアクティブなFacebookセッションを開くのに問題があります) facebook-sdk-for-Android /

私はこれにかなり長い間苦労してきましたが、運がありませんでした!あなたの一人が私を正しい方向に向けてくれたら嬉しいです! (エラーは私の側のセットアップにあると思いますが、それを見つけることができません

これは、私のアクティビティのonCreateでSession.openActiveSession(this、true、new Session.StatusCallback())を呼び出した後に表示されるエラーです(私はfacevook開発者チュートリアルで与えられた手順にほぼ従っています)


編集:次の警告メッセージが最初にログに記録され、次のスクリーンショットでエラーメッセージが続きます

09-03 19:26:22.726:W/Bundle(17458):キーcom.facebook.platform.protocol.PROTOCOL_VERSION期待される文字列ですが、値はJava.lang.Integerでした。デフォルト値が返されました。09-03 19:26:22.736:W/Bundle(17458):生成された内部例外をキャストしようとしました:09-03 19:26:22.736:W/Bundle (17458):Java.lang.ClassCastException:Java.lang.IntegerをJava.lang.Stringにキャストできません09-03 19:26:22.736:W/Bundle(17458):Android.os.Bundle.getString(Bundle) .Java:1061)09-03 19:26:22.736:W/Bundle(17458):Android.content.Intent.getStringExtra(Intent.Java:4466)09-03 19:26:22.736:W/Bundle(17458) ):com.facebook.AuthorizationClient $ KatanaLoginDialogAuthHandler.tryAuthorize(AuthorizationClient.Java:821)09-03 19:26:22.736:W/Bundle(17458):com.facebook.AuthorizationClient.tryCurrentHandler(AuthorizationClient.Java:272)

enter image description here


09-02 22:55:04.110:E/AndroidRuntime(13287):致命的な例外:メイン09-02 22:55:04.110:E/AndroidRuntime(13287):Java.lang.RuntimeException:アクティビティを再開できません{com.good.amrfbintegration /com.facebook.LoginActivity}:Java.lang.NullPointerException09-02 22:55:04.110:E/AndroidRuntime(13287):Android.app.ActivityThread.performResumeActivity(ActivityThread.Java:3036) 09-02 22:55:04.110:E/AndroidRuntime(13287):Android.app.ActivityThread.handleResumeActivity(ActivityThread.Java:3077)09-02 22:55:04.110:E/AndroidRuntime(13287):Androidで。 app.ActivityThread.handleLaunchActivity(ActivityThread.Java:2373)

enter image description here

これが私がこれまでにしたことです

Facebookのアプリを次の情報で更新しました(マシンのデバッグキーストアを使用して生成されたハッシュキーを使用しました)

enter image description here

これが私のマニフェストファイルからの関連情報です(@ string/app_idはFacebook開発ポータルからのアプリIDです)

enter image description here

この方法で、FacebookSDKへの参照をプロジェクトに追加しました

enter image description here

これがメインアクティビティのOnCreateメソッドのコードです

@Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        activity = this;

        Session.openActiveSession(this, true, new Session.StatusCallback() 
        {
            @Override
            public void call(Session session, SessionState state, Exception exception)
            {               
                if (session.isOpened())
                {
                    Toast.makeText(activity, "Connected to Fb", Toast.LENGTH_SHORT).show();
                }
            }});
        }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) 
    {
        super.onActivityResult(requestCode, resultCode, data);
        Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data);
    }

Session.openActiveSessionを実行すると、logcatは最初のスクリーンショットに示されているエラーを表示します。

Session.StatusCallback()のcallメソッドは1回実行されますが(セッションの状態が「opening」の場合)、その後アプリがクラッシュします。これがアプリがクラッシュする前に私が見るものです

enter image description here

どんな援助も大歓迎です!

12
infinity

Facebook SDKが原因でこの問題が発生する場合は、次のURLからFacebook SDK 3.5.2をダウンロードして使用してください:- https://developers.facebook.com/docs/Android/

7
Venkat

はい。コードを確認してください

Manifest.xmlにこれらのものがあることを確認してください

<activity Android:name="com.facebook.LoginActivity"/>
<meta-data Android:name="com.facebook.sdk.ApplicationId" Android:value="@string/app_id"/>

また、@ string/app_idには、Facebookアプリの構成の詳細から取得したapp_idが含まれている必要があります。また、そこに正しいキーハッシュを配置する必要があります。

だから確認してください-

  1. キーハッシュが正しい
  2. Webでアプリを正しく構成し、アプリ構成にアプリIDを配置しました。
3
AnhSirk Dasarp

今日もそうだった。

私の問題は、Facebookアプリがサンドボックスモードになっていることでした。したがって、開発者とテスターだけがそれを使用できました。

アプリのFacebookDeveloperプロパティページから変更します: https://developers.facebook.com/apps

また、ここで私の答えを見つけました: Facebookセッションにアクセスできません-UnknownError:無効なアプリケーション

2
Antilope

私は同じエラーを受け取っていました、グーグルはたくさんのことをしました、そして最後にこれは私がそのエラーから逃れるためにしたことです

  private void getHashKey()
   {
           PackageInfo info;
           try {
           info = getPackageManager().getPackageInfo("Your_Package_Name", PackageManager.GET_SIGNATURES);
           for (Signature signature : info.signatures) {MessageDigest md;
           md = MessageDigest.getInstance("SHA");
           md.update(signature.toByteArray());
                      //String something = new String(Base64.encode(md.digest(), 0));
                        String something = new String(Base64.encode(md.digest(),0));
                      Log.e("** Hash Key", something);
           }
           }
           catch (NameNotFoundException e1) {
           Log.e("name not found", e1.toString());
           }

           catch (NoSuchAlgorithmException e) {
           Log.e("no such an algorithm", e.toString());
           }
           catch (Exception e){
           Log.e("exception", e.toString());
           }

   }

そこで、このコードで生成されたHash_Keyを使用し、Facebook開発者コンソールで更新しました。これで私の問題は解決しました。おそらく、Windowskey_genまたはAndroid key_store

また、FacebookSdkの820行目のAuthorizationClient.Javaファイルも確認してください。

addLoggingExtra(EVENT_EXTRAS_PROTOCOL_VERSION,"" + 
                    intent.getIntExtra(NativeProtocol.EXTRA_PROTOCOL_VERSION, 0));

getIntExtra」に到達しました。「getStringExtra "」として表示されました。これらの変更を行うことは、私のために働いた。それがあなたのためにも働くことを願っています。

0
m0rpheu5

SDK(3.5)を少し掘り下げましたが、EXTRA_PROTOCOL_VERSIONは常に文字列ではなく整数として格納されているようです。つまりNativeProtocol.Javaの場合:

 public static Intent createPlatformActivityIntent(Context context, String action, int version, Bundle extras) {
    Intent intent = new Intent()
            .setAction(INTENT_ACTION_PLATFORM_ACTIVITY)
            .setPackage(FACEBOOK_PACKAGE)
            .addCategory(Intent.CATEGORY_DEFAULT)
            .putExtras(extras)
            .putExtra(EXTRA_PROTOCOL_VERSION, version) //version --> int
            .putExtra(EXTRA_PROTOCOL_ACTION, action);
    return validateKatanaActivityIntent(context, intent);
}

public static Intent createPlatformServiceIntent(Context context) {
    Intent intent = new Intent(INTENT_ACTION_PLATFORM_SERVICE)
            .setPackage(FACEBOOK_PACKAGE)
            .addCategory(Intent.CATEGORY_DEFAULT);
    return validateKatanaServiceIntent(context, intent);
}

public static Intent createLoginDialog20121101Intent(Context context, String applicationId, ArrayList<String> permissions,
        String audience) {
    Intent intent = new Intent()
                .setAction(INTENT_ACTION_PLATFORM_ACTIVITY)
                .setPackage(FACEBOOK_PACKAGE)
                .addCategory(Intent.CATEGORY_DEFAULT)
                .putExtra(EXTRA_PROTOCOL_VERSION, PROTOCOL_VERSION_20121101) // PROTOCOL_VERSION_20121101 --> int
                .putExtra(EXTRA_PROTOCOL_ACTION, ACTION_LOGIN_DIALOG)
                .putExtra(EXTRA_APPLICATION_ID, applicationId)
                .putStringArrayListExtra(EXTRA_PERMISSIONS, ensureDefaultPermissions(permissions))
                .putExtra(EXTRA_PROTOCOL_CALL_ID, generateCallId())
                .putExtra(EXTRA_WRITE_PRIVACY, ensureDefaultAudience(audience));
    return validateKatanaActivityIntent(context, intent);
}

そして、開発者が通常このエラーを受け取る場所では、文字列として読み取られます(AuthorizationCLient.Java l:820):

addLoggingExtra(EVENT_EXTRAS_PROTOCOL_VERSION,
                intent.getStringExtra(NativeProtocol.EXTRA_PROTOCOL_VERSION));

それはどのような場合でも機能しないので、SDKのバグのままです。状況によっては、そのセグメントが実行されるだけです。

コメントはありますか?

0
sinek
// Just write your code in onResume() rather than onCreate().
@Override
public void onResume() {
    super.onResume();

      if(Session.getActiveSession()==null){
          session = new Session(this);
          Session.setActiveSession(session);
     }
     if (Session.getActiveSession().isOpened())
     {
          Toast.makeText(activity, "Connected to Fb", Toast.LENGTH_SHORT).show();
     }else{
        Session.openActiveSession(this, true, new Session.StatusCallback() 
        {
          @Override
          public void call(Session session, SessionState state, Exception exception)
          {               
            if (session.isOpened())
            {
                Toast.makeText(activity, "Connected to Fb", Toast.LENGTH_SHORT).show();
            }
          }});
       }
   }
}
0
Haresh Chhelana