在Android Studio中使用Facebook SDK


104

我正在使用Android Studio关注Android版Facebook SDK。当我运行我的应用程序时,出现以下警告。

Gradle: module 'facebook' won't be compiled. Unfortunately you can't have non-Gradle Java module and Android-Gradle module in one project.

我该如何解决?

我尝试了@Scott Barta的答案,并收到以下错误消息。

    A problem occurred configuring project ':App'.
> Failed to notify project evaluation listener.
   > A problem occurred configuring project ':libraries:facebook'.
      > Failed to notify project evaluation listener.
         > Could not resolve all dependencies for configuration ':libraries:facebook:_DebugCompile'.
            > Could not find any version that matches com.android.support:support-v4:+.
              Required by:
                  MyApplication2.libraries:facebook:unspecified

您的SDK管理员中是否安装了Android支持信息库?
Scott Barta

不。它是强制性的吗?
乌玛

是。那就是您看到的错误消息。我知道这很不直观;改进它在我们的清单上。我将更新答案以反映对此的需求。
Scott Barta

Answers:


250

注意

对于Android Studio 0.5.5和更高版本,以及更高版本的Facebook SDK,此过程比下面记录的过程要简单得多(该过程是为两个版本的早期版本编写的)。如果您运行的是最新版本,则只需执行以下操作:

  1. https://developers.facebook.com/docs/android/下载Facebook SDK
  2. 解压缩档案
  3. 在Android Studio 0.5.5或更高版本中,从“文件”菜单中选择“导入模块”。
  4. 在向导中,设置模块的源路径,以将其导入为解压后的存档内的“ facebook”目录。(注意:如果选择整个父文件夹,它将不仅引入库本身,而且还引入所有示例应用程序,每个作为单独的模块。这可能有用,但可能不是您想要的)。
  5. 打开项目结构Ctrl + Shift + Alt + S,然后选择依赖项选项卡。单击+按钮,然后选择模块依赖性。在新窗口中弹出选择:facebook.
  6. 你应该很好。

旧版Android Studio和旧版Facebook SDK的说明

这适用于Android Studio 0.5.4和更早版本,并且在Facebook提供用于分发的Gradle构建文件之前,对于Facebook SDK版本最有意义。我不知道他们在哪个版本的SDK中进行了更改。

Facebook在其https://developers.facebook.com/docs/getting-started/facebook-sdk-for-android-using-android-studio/3.0/页面上的“将SDK导入Android Studio项目”中的说明是错误的适用于基于Gradle的项目(即您的项目是使用Android Studio的“新建项目”向导构建的,并且/或者具有build.gradle用于您的应用程序模块的文件)。请遵循以下说明:

  1. libraries在项目的主目录下创建一个文件夹。例如,如果您的项目是HelloWorldProject,则将创建一个HelloWorldProject/libraries文件夹。

  2. 现在,将整个facebook目录从SDK安装复制到libraries您刚刚创建的文件夹中。

  3. 删除libs目录中的文件夹facebook。如果你喜欢,删除project.propertiesbuild.xml.classpath,和.project。文件。您不需要它们。

  4. build.gradlefacebook目录中创建一个包含以下内容的文件:

    buildscript {
        repositories {
            mavenCentral()
        }
        dependencies {
            classpath 'com.android.tools.build:gradle:0.6.+'
        }
    }
    
    apply plugin: 'android-library'
    
    dependencies {
        compile 'com.android.support:support-v4:+'
    }
    
    android {
        compileSdkVersion 17
        buildToolsVersion "19.0.0"
    
        defaultConfig {
            minSdkVersion 7
            targetSdkVersion 16
        }
    
        sourceSets {
            main {
                manifest.srcFile 'AndroidManifest.xml'
                java.srcDirs = ['src']
                resources.srcDirs = ['src']
                res.srcDirs = ['res']
            }
        }
    }
    

    请注意,根据您何时遵循这些说明与编写本说明时相比,您可能需要调整classpath 'com.android.tools.build:gradle:0.6.+'行以引用较新版本的Gradle插件。很快,我们将需要0.7或更高版本。尝试一下,如果出现错误,要求使用较新版本的Gradle插件,则必须进行编辑。

  5. 确保已安装SDK管理器中的Android支持库

  6. settings.gradle在应用程序的主目录中编辑文件,并添加以下行:

    include ':libraries:facebook'
  7. 如果您的项目已在Android Studio中打开,请单击工具栏中的“使用Gradle文件同步项目”按钮。完成后,该facebook模块将出现。 在此处输入图片说明

  8. 打开项目结构对话框。从左侧列表中选择“模块”,单击应用程序的模块,单击“依赖关系”选项卡,然后单击“ +”按钮添加新的依赖关系。 在此处输入图片说明
  9. 选择“模块依赖性”。它将弹出一个对话框,其中列出了可供选择的模块;选择“:libraries:facebook”。 在此处输入图片说明
  10. 在所有对话框上单击“确定”。Android Studio将自动重新同步您的项目(无需再次单击“使用Gradle文件同步项目”按钮)并选择新的依赖项。你应该很好。

1
/libraries/facebook/build.gradle给我一些错误。“无法解析compileSdkVersion符号”。与compileSdkVersion符号,清单和其他内容相同...
sensorario 2013年

2
这对我":MyApp:libraries:facebook"有用,但是我必须将facebook图书馆成绩项目的路径更改为绝对路径,即在我的主应用程序的设置文件和build.grade文件中
Mark

7
很好!该答案应该是官方Facebook SDK教程的一部分。
塞缪尔·巴博萨

1
此解决方案不适用于我。在facebook-android-sdk-3.16目录中选择facebook目录后,向导仍会显示“选择要导入的模块”:$。我使用的是Android Studio(测试版)0.8.2。任何想法?
迭戈·帕洛玛

2
他们为什么不能一次简单地使这件事变得简单呢?
Ojonugwa Jude Ochalifu 2014年

108

Facebook确实已将SDK添加到Maven Central存储库中。要使用Maven Repo的实例配置项目,您需要做两件事:

  1. 在您的项目顶级build.gradle文件中,添加Maven Central存储库。我的看起来像这样:

    repositories {
        jcenter()       // This is the default repo
        mavenCentral()  //  This is the Maven Central repo
    }
    
  2. 应用程序级别的build.grade文件中,添加Facebook sdk依赖项:

    dependencies {
    
        compile 'com.facebook.android:facebook-android-sdk:4.5.0' // Adjust the version accordingly
        // All your other dependencies.
    }
    

您还可以调整特定的Facebook SDK版本。有关Maven存储库中可用版本的列表,请单击此链接。


1
它为我工作。这确实是在Android Studio上添加facebook api的最佳方法。谢谢
Olkunmustafa 2014年

1
这是Facebook文档上的方法,但不起作用。我有android studio 1.0和sdk v3.x。
Abhishek Balani 2015年

1
请注意,您应该指定确切的版本号或至少一个主版本号,例如3.23。+。Facebook不怕迅速对API进行版本控制并进行重大更改,这将导致构建失败和不可重复的构建。
格雷格·恩尼斯

@GregEnnis-很好的输入。我略微更新了答案,并在代码中也添加了注释。
SBerg413

因此,我不必导入任何外部库?只是简单地在gradle文件中添加fb sdk?
Kaveesh Kanwal

17

Facebook在maven Central上发布了SDK:

只需添加:

repositories {
    jcenter()       // IntelliJ main repo.
}

dependencies {
    compile 'com.facebook.android:facebook-android-sdk:+'
}

2
这是不对的,您需要在存储库部分中使用mavenCentral()。
Booger

1
jcenter include mavenCentral
Romain

12

斯科特·巴塔(Scott Barta)的解决方案为我工作,除了我必须将这些添加到我的主项目build.gradle文件的依赖项中:

compile files('libs/android-support-v4.jar')
compile project(':libraries:facebook')

同样值得一提的是,您需要确保:

android {
    compileSdkVersion 18
    buildToolsVersion "18.1.1"

    defaultConfig {
        minSdkVersion 7
        targetSdkVersion 18
    }

两个build.gradle文件中的内容都相同...一旦执行此操作,它就会像魅力一样运行。


构建时出现错误:在根项目中找不到路径为'libraries:facebook'的项目...有任何想法吗?(即使我没有settings.gradle文件,我还是根据Scott Bs解决方案添加了该文件夹?!(在Android Studio中创建的项目)
swebal 2013年

1
编译项目行需要匹配您的项目目录结构。:libraries:facebook表示您的Facebook库位于根目录中的“ libraries”文件夹中
doubleA 2014年

6

使用git时,您可以轻松合并最新的facebook-android-sdk。

  • 将facebook-android-sdk添加为子模块: git submodule add https://github.com/facebook/facebook-android-sdk.git
  • 将SDK添加为Gradle项目:编辑settings.gradle并添加以下行: include ':facebook-android-sdk:facebook'
  • 将sdk作为依赖项添加到模块:编辑build.gradle并在依赖项块内添加: compile project(':facebook-android-sdk:facebook')

4

我已经使用facebook sdk 4.10.0将登录集成到我的android应用中。我遵循的教程是:

Facebook登录Android Studio

您将可以从facebbok获取名字,姓氏,电子邮件,性别,facebook ID和出生日期。

上面的教程还介绍了如何通过视频在Facebook开发者控制台中创建应用。

build.gradle(Module:app)文件中添加以下内容:

repositories {
        mavenCentral()
    }

 compile 'com.facebook.android:facebook-android-sdk:4.10.0'

现在在AndroidManifest.xml文件中添加以下内容:

 <meta-data android:name="com.facebook.sdk.ApplicationId" android:value="your app id from facebook developer console"/>

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

在activity_main.xml文件中添加以下内容:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.demonuts.fblogin.MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#000"
        android:layout_marginLeft="10dp"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:id="@+id/text"/>

    <com.facebook.login.widget.LoginButton
        android:id="@+id/btnfb"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="10dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

最后在MainActivity.java文件中添加以下内容:

import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.Signature;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Base64;
import android.util.Log;
import android.widget.TextView;

import com.facebook.AccessToken;
import com.facebook.AccessTokenTracker;
import com.facebook.CallbackManager;
import com.facebook.FacebookCallback;
import com.facebook.FacebookException;
import com.facebook.FacebookSdk;
import com.facebook.GraphRequest;
import com.facebook.GraphResponse;
import com.facebook.Profile;
import com.facebook.ProfileTracker;
import com.facebook.login.LoginResult;
import com.facebook.login.widget.LoginButton;

import org.json.JSONException;
import org.json.JSONObject;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;


public class MainActivity extends AppCompatActivity {

    private TextView tvdetails;
    private CallbackManager callbackManager;
    private AccessTokenTracker accessTokenTracker;
    private ProfileTracker profileTracker;
    private LoginButton loginButton;
    private FacebookCallback<LoginResult> callback = new FacebookCallback<LoginResult>() {
        @Override
        public void onSuccess(LoginResult loginResult) {
            GraphRequest request = GraphRequest.newMeRequest(
                    loginResult.getAccessToken(),
                    new GraphRequest.GraphJSONObjectCallback() {
                        @Override
                        public void onCompleted(JSONObject object, GraphResponse response) {
                            Log.v("LoginActivity", response.toString());

                            // Application code
                            try {
                                Log.d("tttttt",object.getString("id"));
                                String birthday="";
                                if(object.has("birthday")){
                                    birthday = object.getString("birthday"); // 01/31/1980 format
                                }

                                String fnm = object.getString("first_name");
                                String lnm = object.getString("last_name");
                                String mail = object.getString("email");
                                String gender = object.getString("gender");
                                String fid = object.getString("id");
                                tvdetails.setText(fnm+" "+lnm+" \n"+mail+" \n"+gender+" \n"+fid+" \n"+birthday);

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

                        }
                    });
            Bundle parameters = new Bundle();
            parameters.putString("fields", "id, first_name, last_name, email, gender, birthday, location");
            request.setParameters(parameters);
            request.executeAsync();

        }

        @Override
        public void onCancel() {

        }

        @Override
        public void onError(FacebookException error) {

        }
    };


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        FacebookSdk.sdkInitialize(this);
        setContentView(R.layout.activity_main);

        tvdetails = (TextView) findViewById(R.id.text);

        loginButton = (LoginButton) findViewById(R.id.btnfb);

        callbackManager = CallbackManager.Factory.create();

        accessTokenTracker= new AccessTokenTracker() {
            @Override
            protected void onCurrentAccessTokenChanged(AccessToken oldToken, AccessToken newToken) {

            }
        };

        profileTracker = new ProfileTracker() {
            @Override
            protected void onCurrentProfileChanged(Profile oldProfile, Profile newProfile) {

            }
        };

        accessTokenTracker.startTracking();
        profileTracker.startTracking();
        loginButton.setReadPermissions(Arrays.asList("public_profile", "email", "user_birthday", "user_friends"));
        loginButton.registerCallback(callbackManager, callback);

    }

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

    }

    @Override
    public void onStop() {
        super.onStop();
        accessTokenTracker.stopTracking();
        profileTracker.stopTracking();
    }

    @Override
    public void onResume() {
        super.onResume();
        Profile profile = Profile.getCurrentProfile();

    }

}

3

我将Facebook Android SDK部署到Sonatype存储库。

您可以将此库作为Gradle依赖项包括在内:

repositories {
    maven {
        url 'https://oss.sonatype.org/content/groups/public'
    }
}

dependencies {
    compile 'com.shamanland:facebook-android-sdk:3.15.0-SNAPSHOT'
}

原来的帖子在这里


这不再起作用,您的网站已关闭。杀死了我的整个IDE。
Mgamerz 2014年

很奇怪,我使用过一些网站来检查网站是否关闭,甚至无法加载您的主页。
Mgamerz 2014年

2

使用Android Studio 0.8.6的用户可以执行以下操作:

  1. 下载Facebook-android-sdk-xxx.zip并解压缩
  2. 将Facebook-android-sdk-xxx 目录下的facebook目录复制到您的项目中,其中包含app /

    • ImAnApp /
      • |-应用/
      • |-建立/
      • |-Facebook /
  3. 现在您应该看到Android Studio将facebook显示为模块

  4. 将facebook的build.gradle修改为此。
    • 提供的文件('../libs/bolts.jar')到 provided files('./libs/bolts.jar')
    • 将compileSdkVersion Integer.parseInt(project.ANDROID_BUILD_SDK_VERSION)转换为compileSdkVersion 20您在应用程序中定义的其他版本
    • buildToolsVersion项目。ANDROID_BUILD_TOOLS_VERSION到 buildToolsVersion '20.0.0'
    • minSdkVersion Integer.parseInt(project.ANDROID_BUILD_MIN_SDK_VERSION)至 minSdkVersion 14
    • targetSdkVersion Integer.parseInt(project.ANDROID_BUILD_TARGET_SDK_VERSION)到 targetSdkVersion 20

    apply plugin: 'android-library'

    dependencies {
        compile 'com.android.support:support-v4:19.1.+'
        provided files('./libs/bolts.jar')
    }

    android {
        compileSdkVersion 20
        buildToolsVersion '20.0.0'

        defaultConfig {
            minSdkVersion 14
            targetSdkVersion 20
        }

        lintOptions {
            abortOnError false
        }

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

重新同步gradle文件,它应该可以正常工作!


2

我修好了

“在项目':facebook'上找不到属性'ANDROID_BUILD_SDK_VERSION'。”

build.gradle通过添加gradle.properties以下值对文件进行错误处理:

ANDROID_BUILD_TARGET_SDK_VERSION=21<br>
ANDROID_BUILD_MIN_SDK_VERSION=15<br>
ANDROID_BUILD_TOOLS_VERSION=21.1.2<br>
ANDROID_BUILD_SDK_VERSION=21<br>

资料来源:https : //stackoverflow.com/a/21490651/2161698


1

在facebook sdk项目中创建build.gradle文件:

apply plugin: 'android-library'

dependencies {
    compile 'com.android.support:support-v4:18.0.+'
}

android {
    compileSdkVersion 8
    buildToolsVersion "19.0.0"

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

        // Move the build types to build-types/<type>
        // For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ...
        // This moves them out of them default location under src/<type>/... which would
        // conflict with src/ being used by the main source set.
        // Adding new build types or product flavors should be accompanied
        // by a similar customization.
        debug.setRoot('build-types/debug')
        release.setRoot('build-types/release')
    }
}

然后在中添加include ':libs:facebook'equals <project_directory>/libs/facebook(库的路径)settings.gradle


我已经做到了。仍然显示错误。我认为该错误表明Facebook是不分级的,因此无法进行编译。但我不确定
乌玛(Uma),

尝试通过控制台进行构建:./gradlew clean assembleDebug
Vladimir


0

在android studio中使用facebook sdk非常简单,只需在gradle中添加以下行

  compile 'com.facebook.android:facebook-android-sdk:[4,5)'

并确保您已更新Android支持存储库,否则请使用独立的sdk管理器进行更新

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.