Facebook SDK - 错误膨胀类com.facebook.login.widget.LoginButton

时间:2015-08-09 16:14:43

标签: android facebook sdk facebook-sdk-4.0

我刚刚将Facebook SDK安装到我的应用程序中。现在我想显示FB登录按钮,现在我收到了这个错误:

android.view.InflateException: Binary XML file line #33: Error inflating class com.facebook.login.widget.LoginButton

这很奇怪,因为我已经可以在手机上看到FB按钮了。我可以看到活动1秒钟,然后崩溃。

这是xml:

    <com.facebook.login.widget.LoginButton
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="20dp"
        android:id="@+id/signInFacebook"
        />

这是java活动:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    FacebookSdk.sdkInitialize(getApplicationContext());
    setContentView(R.layout.activity);
}

这是app build.gradle:

apply plugin: 'com.android.application'

android {
compileSdkVersion 22
buildToolsVersion "23.0.0 rc2"

defaultConfig {
    applicationId "com.example.stanleysantoso.app"
    minSdkVersion 15
    targetSdkVersion 22
    versionCode 1
    versionName "1.0"
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}
sourceSets { main { res.srcDirs = ['src/main/res', 'src/main/res/anim'] } }
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:22.2.0'
compile fileTree(dir: 'libs', include: 'Parse-*.jar')
compile 'com.parse.bolts:bolts-android:1.+'
//compile 'com.facebook.android:facebook-android-sdk:4.5.1'
compile project(':libraries:facebook')
}

这是facebook build.gradle:

apply plugin: 'com.android.library'

repositories {
mavenCentral()
}

project.group = 'com.facebook.android'

dependencies {
compile 'com.android.support:appcompat-v7:22.2.0'
compile 'com.parse.bolts:bolts-android:1.+'


}

android {
compileSdkVersion 22
buildToolsVersion "23.0.0 rc2"


defaultConfig {
    minSdkVersion 15
    targetSdkVersion 22
    versionCode 1
    versionName "1.0"
}

lintOptions {
    abortOnError false
}

sourceSets {
    main {
        manifest.srcFile 'AndroidManifest.xml'
        java.srcDirs = ['src']
        //resources.srcDirs = ['src']
        res.srcDirs = ['res']
    }
}

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_7
    targetCompatibility JavaVersion.VERSION_1_7
}
}

apply plugin: 'maven'
apply plugin: 'signing'

def isSnapshot = version.endsWith('-SNAPSHOT')
def ossrhUsername = hasProperty('NEXUS_USERNAME') ? NEXUS_USERNAME : ""
def ossrhPassword = hasProperty('NEXUS_PASSWORD') ? NEXUS_PASSWORD : ""

task setVersion {
// The version will be derived from source
project.version = null
def sdkVersionFile = file('src/com/facebook/FacebookSdkVersion.java')
sdkVersionFile.eachLine{
    def matcher = (it =~ /(?:.*BUILD = \")(.*)(?:\".*)/)
    if (matcher.matches()) {
        project.version = matcher[0][1]
        return
    }
}
if (project.version.is('unspecified')) {
    throw new GradleScriptException('Version could not be found.', null)
}
}

uploadArchives {
repositories.mavenDeployer {
    beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) }

    repository(url: "https://oss.sonatype.org/service/local/staging/deploy/maven2/") {
        authentication(userName: ossrhUsername, password: ossrhPassword)
    }

    snapshotRepository(url: "https://oss.sonatype.org/content/repositories/snapshots/") {
        authentication(userName: ossrhUsername, password: ossrhPassword)
    }

    pom.project {
        name 'Facebook-Android-SDK'
        artifactId = 'facebook-android-sdk'
        packaging 'aar'
        description 'Facebook Android SDK'
        url 'https://github.com/facebook/facebook-android-sdk'

        scm {
            connection 'scm:git@github.com:facebook/facebook-android-sdk.git'
            developerConnection 'scm:git@github.com:facebook/facebook-android-sdk.git'
            url 'https://github.com/facebook/facebook-android-sdk'
        }

        licenses {
            license {
                name 'Facebook Platform License'
                url 'https://github.com/facebook/facebook-android-sdk/blob/master/LICENSE.txt'
                distribution 'repo'
            }
        }

        developers {
            developer {
                id 'facebook'
                name 'Facebook'
            }
        }
    }
}
}

uploadArchives.dependsOn(setVersion)

signing {
required { !isSnapshot && gradle.taskGraph.hasTask("uploadArchives") }
sign configurations.archives
}

task androidJavadocs(type: Javadoc) {
source = android.sourceSets.main.java.srcDirs
classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
// JDK 1.8 is more strict then 1.7. Have JDK 1.8 behave like 1.7 for javadoc generation
if (org.gradle.internal.jvm.Jvm.current().getJavaVersion() == JavaVersion.VERSION_1_8) {
    options.addStringOption('Xdoclint:none', '-quiet')
}
}

task androidJavadocsJar(type: Jar, dependsOn: androidJavadocs) {
classifier = 'javadoc'
from androidJavadocs.destinationDir
}

task androidSourcesJar(type: Jar) {
classifier = 'sources'
from android.sourceSets.main.java.sourceFiles
}

artifacts {
archives androidSourcesJar
archives androidJavadocsJar
}

afterEvaluate {
androidJavadocs.classpath += project.android.libraryVariants.toList().first().javaCompile.classpath
}

这是setting.gradle:

include ':app'
include ':libraries:facebook'

请帮帮我。非常感谢你。

修改

我也遇到了这个错误:

java.lang.NullPointerException
        at java.util.concurrent.ConcurrentHashMap.containsKey(ConcurrentHashMap.java:911)
        at com.facebook.internal.Utility.queryAppSettings(Utility.java:825)
        at com.facebook.login.widget.LoginButton$1.run(LoginButton.java:489)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
        at java.lang.Thread.run(Thread.java:841)

他们指向这段代码:

在LoginButton.java中:

private void checkToolTipSettings() {
    switch (toolTipMode) {
        case AUTOMATIC:
            // kick off an async request
            final String appId = Utility.getMetadataApplicationId(getContext());
            FacebookSdk.getExecutor().execute(new Runnable() {
                @Override
                public void run() {
                    final FetchedAppSettings settings = Utility.queryAppSettings(appId, false);
                    getActivity().runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            showToolTipPerSettings(settings);
                        }
                    });
                }
            });
            break;
        case DISPLAY_ALWAYS:
            String toolTipString = getResources().getString(
                    R.string.com_facebook_tooltip_default);
            displayToolTip(toolTipString);
            break;
        case NEVER_DISPLAY:
            break;
    }
}
在Utility.java中

// main thread.
public static FetchedAppSettings queryAppSettings(
        final String applicationId,
        final boolean forceRequery) {
    // Cache the last app checked results.
    if (!forceRequery && fetchedAppSettings.containsKey(applicationId)) {
        return fetchedAppSettings.get(applicationId);
    }

    JSONObject response = getAppSettingsQueryResponse(applicationId);
    if (response == null) {
        return null;
    }

    return parseAppSettingsFromJSON(applicationId, response);
}

2 个答案:

答案 0 :(得分:2)

将此代码放入Manifest.xml中的应用程序标记中

        <activity
            android:name="com.facebook.CustomTabActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />

                <data android:scheme="@string/fb_login_protocol_scheme" />
            </intent-filter>
        </activity>

对我有用

答案 1 :(得分:0)

你的Facebook SDK没有导入。尝试按照开发者网站上的说明进行操作,因为自从您观看我的视频教程后,它们可能已经发生了变化。