Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/194.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Can';无法使用Facebook API获取位置和电子邮件_Java_Android_Facebook Graph Api - Fatal编程技术网

Java Can';无法使用Facebook API获取位置和电子邮件

Java Can';无法使用Facebook API获取位置和电子邮件,java,android,facebook-graph-api,Java,Android,Facebook Graph Api,在我的Android应用程序中,我开发了这段代码以使用我的帐户登录,并获取用户名、位置和电子邮件等用户属性。问题是我可以得到名字,但我不能得到电子邮件和地址。当我在没有尝试的情况下尝试我的代码时,请在getproperty(“email”)和getlocation()中捕获应用程序崩溃和我的日志点。当我使用时,请尝试。应用程序正常工作,但没有电子邮件或位置 public class Share extends Fragment {private static final String TAG =

在我的Android应用程序中,我开发了这段代码以使用我的帐户登录,并获取用户名、位置和电子邮件等用户属性。问题是我可以得到名字,但我不能得到电子邮件和地址。当我在没有尝试的情况下尝试我的代码时,请在
getproperty(“email”)
getlocation()
中捕获应用程序崩溃和我的日志点。当我使用时,请尝试。应用程序正常工作,但没有电子邮件或位置

public class Share extends Fragment {private static final String TAG ="Share";private UiLifecycleHelper uiHelper;
private View otherView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // To maintain FB Login session
        uiHelper = new UiLifecycleHelper(getActivity(), callback);
        uiHelper.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.share, container, false);
        // Looks for Login button
        LoginButton authButton = (LoginButton) view.findViewById(R.id.authButton);
        authButton.setFragment(this);
        // Set View that should be visible after log-in invisible initially
        otherView = view.findViewById(R.id.other_views);
        otherView.setVisibility(View.GONE);
        //authButton.setReadPermissions(Arrays.asList("user_likes", "user_status","email","user_birthday"));
        return view;
    }

    // Called when session changes
    private Session.StatusCallback callback = new Session.StatusCallback() {
        @Override
        public void call(Session session, SessionState state,Exception exception) {
            onSessionStateChange(session, state, exception);
        }
    };

    // When session is changed, this method is called from callback method
    private void onSessionStateChange(Session session, SessionState state,Exception exception) {
        final TextView name = (TextView) getView().findViewById(R.id.name);
        final TextView mail = (TextView) getView().findViewById(R.id.mail);
        final TextView location = (TextView) getView().findViewById(R.id.location);
        final TextView locale   = (TextView) getView().findViewById(R.id.locale);
        final TextView info = (TextView)getView().findViewById(R.id.msginfo);
        final LinearLayout views= (LinearLayout)getView().findViewById(R.id.other_views);

        if (state.isOpened()) {
            Log.i(TAG, "Logged in...");
            // make request to the /me API to get Graph user
            views.setVisibility(View.VISIBLE);
            info.setText("You can now share images in facebook ");
            Request.newMeRequest(session, new Request.GraphUserCallback() {

                // callback after Graph API response with user
                // object
                @Override
                public void onCompleted(GraphUser user, Response response) {
                    if (user != null) {
                        try {
                            // Set view visibility to true
                            otherView.setVisibility(View.VISIBLE);
                            // Set User name
                            name.setText("Hello " + user.getName());
                            // Set Email
                            mail.setText("Your Email: " + user.getProperty("email").toString());
                            locale.setText("Locale: " + user.getProperty("locale").toString());
                            location.setText("Your Current Location: " + user.getLocation().getProperty("name").toString());

                        }
                        catch(Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
            }).executeAsync();
        } else if (state.isClosed()) {
            views.setVisibility(View.INVISIBLE);
            info.setText("If you want to share images in Facebook, please Login");

            Log.i(TAG, "Logged out...");
            otherView.setVisibility(View.GONE);
        }
    }


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

        uiHelper.onActivityResult(requestCode, resultCode, data);
        Log.i(TAG, "OnActivityResult...");
    }

    @Override
    public void onResume() {
        super.onResume();
        uiHelper.onResume();
    }

    @Override
    public void onPause() {
        super.onPause();
        uiHelper.onPause();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        uiHelper.onDestroy();
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        uiHelper.onSaveInstanceState(outState);
    }
}

问题是您没有请求权限:

authButton.setReadPermissions(Arrays.asList("user_likes", "user_status","email","user_birthday"));
但是,您使用的是较旧的Facebook SDK,而。下面,我将基于最新的API为您提供Facebook登录的完整示例代码。请记住,正如前面提到的,您首先必须在
developers.facebook
中添加应用程序

public class LoginActivity extends ActionBarActivity{

@Override
protected void onActivityResult(int requestCode, int responseCode, Intent data)
{
    super.onActivityResult(requestCode, responseCode, data);
    callbackManager.onActivityResult(requestCode, responseCode, data);
}

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    FacebookSdk.sdkInitialize(this.getApplicationContext());
    setContentView(R.layout.activity_login);
    callbackManager = CallbackManager.Factory.create();
    loginButton = (LoginButton) findViewById(R.id.loginFaceBook_button);
    List<String> permissionNeeds = Arrays.asList("user_photos", "email", "user_birthday", "public_profile");
    loginButton.setReadPermissions(permissionNeeds);

    loginButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>()
    {
        @Override
        public void onSuccess(LoginResult loginResult)
        {
            System.out.println("onSuccess");
            GraphRequest request = GraphRequest.newMeRequest
                    (loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback()
                    {
                        @Override
                        public void onCompleted(JSONObject object, GraphResponse response)
                        {
                            // Application code
                            Log.v("LoginActivity", response.toString());
                            //System.out.println("Check: " + response.toString());
                            try
                            {
                                String id = object.getString("id");
                                String name = object.getString("name");
                                String email = object.getString("email");
                                String gender = object.getString("gender");
                                String birthday = object.getString("birthday");
                                System.out.println(id + ", " + name + ", " + email + ", " + gender + ", " + birthday);
                            }
                            catch (JSONException e)
                            {
                                e.printStackTrace();
                            }

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

        @Override
        public void onCancel()
        {
            System.out.println("onCancel");
        }

        @Override
        public void onError(FacebookException exception)
        {
            System.out.println("onError");
            Log.v("LoginActivity", exception.getCause().toString());
        }
    });
  }
}
您还需要向应用程序添加一个散列键。以下是使用代码执行此操作的方法:

try
{
    //paste Your package name at the first parameter
    PackageInfo info = getPackageManager().getPackageInfo("PUT_YOUR_PACKAGE_NAME_HERE",
            PackageManager.GET_SIGNATURES);
    for (android.content.pm.Signature signature : info.signatures)
    {
        MessageDigest md = MessageDigest.getInstance("SHA");
        md.update(signature.toByteArray());
        String sign = Base64.encodeToString(md.digest(), Base64.DEFAULT);
        Log.e("MY KEY HASH:", sign);
        Toast.makeText(getApplicationContext(),sign,     Toast.LENGTH_LONG).show();
    }
}
catch (PackageManager.NameNotFoundException e)
{
}
catch (NoSuchAlgorithmException e)
{
}
在它打印出散列密钥后,您可以将其复制粘贴到项目所在的
facebook.developer
帐户

在grandle中,您应该在
repositories
中添加
jcenter
,并在
dependecies
中添加
compile'com.facebook.android:facebook android sdk:4.0.0'

buildscript {
repositories {
    jcenter()
}
dependencies {
    classpath 'com.android.tools.build:gradle:1.1.0'
    // NOTE: Do not place your application dependencies here; they belong
    // in the individual module build.gradle files
}
}
allprojects 
{
repositories {
    jcenter()
    /*more project attrs..*/
  }
}
还有另一个grandle文件:

apply plugin: 'com.android.application'
android {
compileSdkVersion 21
buildToolsVersion "21.1.2"

defaultConfig {
    applicationId "YOUR_PACKAGE_NAME"
    minSdkVersion 14
    targetSdkVersion 21
    versionCode 1
    versionName "1.0"
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}
}dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:21.0.3'
compile 'com.facebook.android:facebook-android-sdk:4.0.0'
}
编辑:


为了跟踪用户的位置,你需要一个GPS跟踪器,比如
“user\u location”
权限不会返回
lon,lat
,而是返回一个对象,我认为这不是您想要的。因此,您的权限应该是
List permissionNeeds=Arrays.asList(“用户照片”、“电子邮件”、“用户生日”、“公共档案”)
现在你应该可以检索用户的电子邮件了

你要求权限了吗?我只需要互联网权限。我可以登录并拥有我的图像和用户名,所以我认为问题不在于权限。我说的是Facebook权限!啊,是的,我有我的身份证,这是我放在舱单上的:那是你的身份证,我不是在说这个。在您的代码
//authButton.setReadPermissions(Arrays.asList(“用户喜欢”、“用户状态”、“电子邮件”、“用户生日”))中选中此项谢谢。我升级到最新的facebook sdk,但是我对build.gradle有问题。你能把你的gradle发送给我吗?@user3921905我确实添加了build.grandle文件
com.facebook.android:facebook安卓sdk:4.0.0'
应该在这里完成这项工作。让我知道,如果这解决了你的问题,也是关于清单和grandle设置的完整文档。我尝试了你的代码,但我不知道为什么我的电子邮件总是返回null。当我使用username.setText(name)时,textview中没有任何内容,但我可以在调试代码时看到结果?@user3921905,这样您就可以在控制台中看到所有结果,但您在将其设置为
textview
时遇到问题?然后确保在textview上有一个引用,例如:
textview mTextView=(textview)findViewById(R.id.mTextView)
。因为代码运行,所以这将是唯一的情况。。另外,如果您正在对
片段运行代码,请确保在权限行之后有这行代码:
loginButton.setFragment(this)获得引用后,写:
username.setText(String.valueOf(name))
apply plugin: 'com.android.application'
android {
compileSdkVersion 21
buildToolsVersion "21.1.2"

defaultConfig {
    applicationId "YOUR_PACKAGE_NAME"
    minSdkVersion 14
    targetSdkVersion 21
    versionCode 1
    versionName "1.0"
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}
}dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:21.0.3'
compile 'com.facebook.android:facebook-android-sdk:4.0.0'
}