71

我一直在按照以下教程将我的应用程序与 Facebook 集成。 脸书教程

我已经按照教程中的所有内容进行了操作,但是我遇到applicationId cannot be null了两种情况,这真的很令人沮丧。

FacebookActivity onCreate的有以下,和教程一模一样:

public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState);
    uiHelper = new UiLifecycleHelper(this, callback);
    uiHelper.onCreate(savedInstanceState);
    setContentView(R.layout.main_fb);

    FragmentManager fm = getSupportFragmentManager();
    fragments[SPLASH] = fm.findFragmentById(R.id.splashFragment);
    fragments[SELECTION] = fm.findFragmentById(R.id.selectionFragment);

    FragmentTransaction transaction = fm.beginTransaction();
    for(int i = 0; i < fragments.length; i++) 
    {
        transaction.hide(fragments[i]);
    }
    transaction.commit();
}

但是,当我尝试显示我得到的活动时applicationId cannot be null,LogCat 指向我的行是:uiHelper.onCreate(savedInstanceState);

因此,我尝试注释掉该行,并显示活动。但是现在当我点击 时LoginButton,我得到了同样的错误,但这一次是指向我来自 Facebook 的 LoginButton 类中的 applicationId 字段。

我的字符串值和清单中已经有 Id,如下所示:

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

我尝试使用代码获取 ID,但没有任何改变。

究竟是什么导致了这一切?

4

5 回答 5

226

TL; DR:您必须strings.xml在您的然后引用(即)中写入应用程序的 ID @strings/fb_app_id,因为如果您直接将其(作为值)放入AndroidManifest.xml它将不起作用。

你必须像这样定义你applicationIdAndroidManifest.xml

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

<application android:label="@string/app_name"....标签下

app_id你的strings.xml.


样本:

 <application android:label="@string/app_name"
                 android:icon="@drawable/icon"
                 android:theme="@android:style/Theme.NoTitleBar"
            >
        <activity android:name=".HelloFacebookSampleActivity"
                  android:label="@string/app_name"
                  android:windowSoftInputMode="adjustResize">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
        <activity android:name="com.facebook.LoginActivity"
                  android:theme="@android:style/Theme.Translucent.NoTitleBar"
                  android:label="@string/app_name" />
        <meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/app_id"/>
    </application>

** 请注意<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/app_id"/><application>标签内

-- 在 strings.xml 中

<string name="app_id">1389xxxxxxxx</string>
于 2013-04-22T21:19:13.450 回答
8

从今天开始,答案并不完全正确。如果有人没有使用这个: AppEventsLogger.activateApp(this);

自上次更新以来,您必须这样做,否则您的应用程序将崩溃。你也应该在这里传递Application而不是Context

https://developers.facebook.com/docs/android/getting-started

// Add this to the header of your file:
import com.facebook.FacebookSdk;

public class MyApplication extends Application {
    // Updated your class body:
    @Override
    public void onCreate() {
        super.onCreate();
        // Initialize the SDK before executing any other operations,
        FacebookSdk.sdkInitialize(getApplicationContext());
        AppEventsLogger.activateApp(this);
    }
}
于 2016-06-16T22:48:31.393 回答
7

问题是 id 被转换为整数: https ://code.google.com/p/android/issues/detail?id=78839

在我的情况下,每个风味facebook_app_id都是从文件中设置的。build.gradle

解决方案是用 id 包装"

flavor.resValue "string", "facebook_app_id", "\"1111111111111\""

或者如果您宁愿避免转义:

flavor.resValue "string", "facebook_app_id", '"1111111111111"'
于 2015-04-08T16:01:06.867 回答
0

活动中的这个小代码修改帮助了我。

@Override
    protected void onCreate(Bundle savedInstanceState) {

        FacebookSdk.sdkInitialize(getApplicationContext());
        AppEventsLogger.activateApp(getApplication());

        super.onCreate(savedInstanceState);
        ...................
        ...................    
}
于 2016-06-17T08:39:28.160 回答
-1

实际上,您不必在 gradle 中使用风味代码...

如果您的数字超过 4 个字节,您应该在 strings.xml 中使用此代码

注意:注意这个引号(

<string name="facebook_app_id">"1111111111111"</string>
于 2015-06-07T23:09:12.360 回答