Android facebook applicationId不能为null


71

我一直在遵循以下教程将我的应用程序与Facebook集成。 Facebook教程

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

MyFacebookActivity 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,但没有任何更改。

到底是什么原因造成的?

Answers:


226

TL; DR:您必须在应用程序中写入应用程序的ID strings.xml,然后引用(即@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>

46
显然,您必须将其放在strings.xml中,因为如果直接在AndroidManifest.xml中引用它,将无法正常工作。那种怪异的行为,因为这种方式可以与Google API一起使用...
Mike Drakoulelis 2014年

5
@MikeDrakoulelis没错,因为如果直接在AndroidManifest.xml中引用它,它将解析为Integer
Mohammad Ersan 2014年

15
您可以将其放在AndroidManifest.xml中,并通过在字符串前加上前缀来避免转换为Integer :(<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="\ XXXXXXXXXXXXXXXXX"/>请注意转义字符和ID字符串之间的空格)
Mark Beaton 2014年

1
如果null由于String资源解析中的某些错误而将applicatiodId报告为Facebook sdk,则可以在初始化sdk之后手动设置applicationId。 FacebookSdk.sdkInitialize(getApplicationContext()); FacebookSdk.setApplicationId(getResources().getString(R.string.app_id)); mFacebookCallbackManager = CallbackManager.Factory.create();
2015年

我有@MarkBeaton和Mike所说的。您可以编辑答案以指出细节吗?使我浪费了半个小时。总结:您不能将applicationId粘贴到清单中,必须使用字符串资源将其链接,或者像Mark所说的那样添加初始分隔符
voghDev

8

从今天起,答案还不是很正确。如果有人不使用它: AppEventsLogger.activateApp(this);

自上次更新以来,您必须执行此操作,否则您的应用程序将崩溃。而且您还应该在此处通过应用程序而不是上下文

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

2
有没有搞错。这只是让我的应用崩溃了。是我还是Facebook努力监视我们?首先,他们禁止从其图形API提取消息。然后,除非您安装需要9271491724权限的Messenger应用,否则他们会在移动浏览器上禁用消息,现在他们强迫您使用事件记录器记录您的应用。
SudoPlz

他们何时实现添加此代码:AppEventsLogger.activateApp(this); 前几天?因为昨天我对此没有任何问题
Binev

@IvanBinev在我回答前30分钟:)
Yura Buyaroff

超级有线,但它能正常工作,为什么FB如此疯狂,您需要接受的答案,这个答案和FB sdk的最新版本都没有问题!
Stoycho Andreev

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"'

flavour.resValue“ string”,“ facebook_app_id”,'“ 1111111111111”'此解决方案为我工作。谢谢
Orcun Sevsay 2015年

0

活动中的这段代码修改对我有所帮助。

@Override
    protected void onCreate(Bundle savedInstanceState) {

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

        super.onCreate(savedInstanceState);
        ...................
        ...................    
}

-1

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

如果您的数字长于4个字节,则应在strings.xml中使用此代码

注意:注意此引号(

<string name="facebook_app_id">"1111111111111"</string>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.