Android Facebook SDK-膨胀类com.Facebook.login.widget.LoginButton时出错

Android Facebook SDK-膨胀类com.Facebook.login.widget.LoginButton时出错,android,facebook,sdk,facebook-sdk-4.0,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 java.lang.NullPointerException at java.util.concurrent.ConcurrentHashMap

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

android.view.InflateException: Binary XML file line #33: Error inflating class com.facebook.login.widget.LoginButton
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)
这是非常奇怪的,因为我已经可以看到我的手机上的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"
        />
这是应用程序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')
}
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
}
这是facebook 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')
}
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
}
这是设置。gradle:

include ':app'
include ':libraries:facebook'
请帮帮我。多谢各位

编辑

我也得到了这个错误:

android.view.InflateException: Binary XML file line #33: Error inflating class com.facebook.login.widget.LoginButton
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);
}

您很抱歉,Facebook SDK未导入。尝试按照开发者网站上的说明进行操作,因为自您观看我的视频教程以来,这些说明可能已经发生了变化。

将此代码放入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>


它对我起了作用

我想我不明白。你能发一些代码吗?我不知道如何按照他们的指示导入。这就是为什么我遵循你的教程。如果我按照他们的指示去做,我不知道把facebook sdk文件夹放在哪里。它不是用.jar格式制作的,我也相信已经导入了fcebook SDK,因为我可以在activity.java中导入facebook,也可以在xml中使用facebook小部件。我甚至可以看到facebook的蓝色登录按钮。