web-dev-qa-db-ja.com

Facebook SDK 4.0.1ログインボタンなしのログイン

ログインボタンを使用せずにログインしようとしています。私はfacebookのチュートリアルに従っていましたが、うまくいきません。常にNullPointerExceptionをください。私のマニフェスト:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
    package="com.example.hema.testfcaebooksdk" >

    <uses-permission Android:name="Android.permission.INTERNET"/>

    <application
        Android:allowBackup="true"
        Android:icon="@mipmap/ic_launcher"
        Android:label="@string/app_name"
        Android:theme="@style/AppTheme" >

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

        <activity Android:name="com.facebook.FacebookActivity"
            Android:configChanges=
                "keyboard|keyboardHidden|screenLayout|screenSize|orientation"
            Android:theme="@Android:style/Theme.Translucent.NoTitleBar"
            Android:label="@string/app_name" />

        <provider Android:authorities="com.facebook.app.FacebookContentProvider****************"
            Android:name="com.facebook.FacebookContentProvider"
            Android:exported="true" />

        <activity
            Android:name=".MainActivity"
            Android:label="@string/app_name" >
            <intent-filter>
                <action Android:name="Android.intent.action.MAIN" />

                <category Android:name="Android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Facebookにログインするために使用するアクティビティ:

public class MainActivity extends ActionBarActivity {

    CallbackManager callbackManager;
    LoginManager loginManager;

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

        FacebookSdk.sdkInitialize(getApplicationContext());

        callbackManager = CallbackManager.Factory.create();

        loginManager = LoginManager.getInstance();

        loginManager.registerCallback(callbackManager,
                new FacebookCallback<LoginResult>() {
                    @Override
                    public void onSuccess(LoginResult loginResult) {
                        // App code
                        Toast.makeText(getApplicationContext(), loginResult.getAccessToken().toString(), Toast.LENGTH_SHORT).show();

                    }

                    @Override
                    public void onCancel() {
                        // App code
                    }

                    @Override
                    public void onError(FacebookException exception) {
                        // App code
                    }
                });

        Collection<String> permissions = Arrays.asList("public_profile", "user_friends");

        loginManager.logInWithReadPermissions(this, permissions); // Null Pointer Exception here
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        callbackManager.onActivityResult(requestCode, resultCode, data);
    }
}

私のログ猫:

04-14 20:03:46.840    8075-8075/com.example.hema.testfacebooksdk E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.example.hema.testfacebooksdk, PID: 8075
    Java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.hema.testfacebooksdk/com.example.hema.testfacebooksdk.MainActivity}: Java.lang.NullPointerException
            at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2413)
            at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:2471)
            at Android.app.ActivityThread.access$900(ActivityThread.Java:175)
            at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1308)
            at Android.os.Handler.dispatchMessage(Handler.Java:102)
            at Android.os.Looper.loop(Looper.Java:146)
            at Android.app.ActivityThread.main(ActivityThread.Java:5602)
            at Java.lang.reflect.Method.invokeNative(Native Method)
            at Java.lang.reflect.Method.invoke(Method.Java:515)
            at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:1283)
            at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:1099)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: Java.lang.NullPointerException
            at com.facebook.login.LoginManager.getLogger(LoginManager.Java:391)
            at com.facebook.login.LoginManager.logCompleteLogin(LoginManager.Java:414)
            at com.facebook.login.LoginManager.startLogin(LoginManager.Java:384)
            at com.facebook.login.LoginManager.logInWithReadPermissions(LoginManager.Java:262)
            at com.example.hema.testfacebooksdk.MainActivity.onCreate(MainActivity.Java:59)
            at Android.app.Activity.performCreate(Activity.Java:5451)
            at Android.app.Instrumentation.callActivityOnCreate(Instrumentation.Java:1093)
            at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2377)
            at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:2471)
            at Android.app.ActivityThread.access$900(ActivityThread.Java:175)
            at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1308)
            at Android.os.Handler.dispatchMessage(Handler.Java:102)
            at Android.os.Looper.loop(Looper.Java:146)
            at Android.app.ActivityThread.main(ActivityThread.Java:5602)
            at Java.lang.reflect.Method.invokeNative(Native Method)
            at Java.lang.reflect.Method.invoke(Method.Java:515)
            at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:1283)
            at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:1099)
            at dalvik.system.NativeStart.main(Native Method)

私はすべてを試しましたが、NullPointerException助けてください!

18
Ibrahim Disouki

あなたがすでにあなたの問題を解決したかどうかわかりませんが、ここに私がそれを解決した方法があります

 List<String> permissionNeeds= Arrays.asList("user_photos", "friends_photos", "email", "user_birthday", "user_friends");




 super.onCreate(savedInstanceState);
    FacebookSdk.sdkInitialize(getApplicationContext());
    mCallbackManager = CallbackManager.Factory.create();
    LoginManager.getInstance().logInWithReadPermissions(
            this,
           permissionNeeds);
    LoginManager.getInstance().registerCallback(mCallbackManager,
            new FacebookCallback<LoginResult>() {
                @Override
                public void onSuccess(LoginResult loginResults) {

                    GraphRequest request = GraphRequest.newMeRequest(
                            loginResults.getAccessToken(),
                            new GraphRequest.GraphJSONObjectCallback() {
                                @Override
                                public void onCompleted(
                                        JSONObject object,
                                        GraphResponse response) {
                                    // Application code
                                    Log.v("LoginActivity", response.toString());
                                }
                            });
                    Bundle parameters = new Bundle();
                    parameters.putString("fields", "id,name,email,gender, birthday");
                    request.setParameters(parameters);
                    request.executeAsync();

                }
                @Override
                public void onCancel() {

                    Log.e("dd","facebook login canceled");

                }


                @Override
                public void onError(FacebookException e) {



                    Log.e("dd", "facebook login failed error");

                }
            });
21
Soham

最初のアクティビティノードではなく、アプリケーションノードの下にメタデータとアクティビティを移動してみてください。

<application
    Android:allowBackup="true"
    Android:icon="@mipmap/ic_launcher"
    Android:label="@string/app_name"
    Android:theme="@style/AppTheme" >

    <meta-data Android:name="com.facebook.sdk.ApplicationId" Android:value="@string/facebook_app_id"/>
    <activity
        Android:name=".MainActivity"
        Android:label="@string/app_name" >
        <intent-filter>
            <action Android:name="Android.intent.action.MAIN" />

            <category Android:name="Android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity Android:name="com.facebook.FacebookActivity" />
</application>
6
MParker

問題は、FacebookSdk.sdkInitialize(getApplicationContext());の後にsetContentView(R.layout.activity_main);を使用することです。使用する必要がありますbeforesetContentView()。サンプルコードを含む完全なfacebookログイン例を見つけることができます here

この方法で試してください:

  • Facebook開発者にAndroidアプリを作成し、開発モードではなくパブリックに設定します。

  • マニフェスト:

    _    <meta-data Android:name="com.facebook.sdk.ApplicationId" Android:value="@string/facebook_app_id"/>
    <activity
        Android:name="com.facebook.FacebookActivity"
        Android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
        Android:label="@string/app_name"/>
    _
  • Strings.xml

    XXXXXXXXXXXXXX

  • ログインにフラグメントを使用する場合、適切な方法は次のとおりです。

ステップ1:

_    CallbackManager mCallbackManager;

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //@Deprecated for latest version, without this line working fine. 
        //FacebookSdk.sdkInitialize(getActivity().getApplicationContext());


        mCallbackManager = CallbackManager.Factory.create();

        LoginManager.getInstance().registerCallback(mCallbackManager,
            new FacebookCallback<LoginResult>() {
                @Override
                public void onSuccess(LoginResult loginResult) {
                    // App code
                    Log.e("Success", "Login");
                    Bundle parameters = new Bundle();
                    parameters.putString("fields", "id, first_name, last_name ,email, gender, birthday");

                    GraphRequest gr = GraphRequest.newMeRequest(
                            loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback() {
                                @Override
                                public void onCompleted(JSONObject json, GraphResponse response) {
                                    if (response.getError() != null) {
                                        // handle error
                                        System.out.println("ERROR "+response.getError().toString());
                                    } else {
                                        //System.out.println("Success");
                                        try {

                                            String jsonresult = String.valueOf(json);
                                            System.out.println("JSON Result"+jsonresult);
                                            String resp = String.valueOf(response.getJSONObject());
                                            System.out.println("JSON resp "+resp);


                                        } catch (JSONException e) {
                                            e.printStackTrace();
                                        }
                                    }
                                }

                            });
                    gr.setParameters(parameters);
                    gr.executeAsync();

                }

                @Override
                public void onCancel() {
                    // App code
                    Log.e("onCancel", "Login");
                }

                @Override
                public void onError(FacebookException onError) {
                    // App code
                    Log.e("onError", "Login "+onError.getMessage());
                }
            });
    }
_

ステップ2:

_    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == Activity.RESULT_OK) {
            mCallbackManager.onActivityResult(requestCode, resultCode, data);
        }
    }
_

ステップ3:-OnClickListenerの内部

_LoginManager.getInstance().logInWithReadPermissions(YourFragment.this, Arrays.asList("public_profile"));
_

私はgetActivity()を使用していました。このため、毎回何かが点滅し、代わりにFacebookログインビューが表示されていました。基本的に、代わりにgetActivity()は_FragmentClaseName.this_を使用する必要があります。これがあなたのお役に立てば幸いです。ハッピーコーディング!!!

4
enam

たぶん、あなたのAndroidManifest.xmlに以下のようにこのコードを追加するのを忘れた

<activity
        Android:name="com.facebook.FacebookActivity"
        Android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
        Android:label="@string/app_name"
        Android:theme="@Android:style/Theme.Translucent.NoTitleBar" />
<meta-data
        Android:name="com.facebook.sdk.ApplicationId"
        Android:value="@string/facebook_app_id" />
3
Guu

1)setContentView()の前にSDKを初期化する必要があります

2)ボタンクリックリスナーにLoginmanager.getInstance()。logInWithReadPermission(.....)を書き込む必要があります

0
Pratik Deogade