2014-05-08 46 views
4

请帮助我使用3.14 SDK从我的个人资料中获取Facebook朋友。代码中没有错误,但问题是在获取我的配置文件中的朋友时获取空列表。我得到logcat错误说
Facebook的朋友选择器SDK示例不工作Android

05-08 16:18:49.252: E/ActivityThread(25644): Failed to find provider info for com.facebook.orca.provider.PlatformProvider<br> 
05-08 16:42:20.453: I/QCNEA(28696): |NIMS| getaddrinfo: hostname graph.facebook.com servname NULL numeric 4 appname <br> 
05-08 16:51:32.482: D/Request(31861): Warning: Sessionless Request needs token but missing either application ID or client token<br> 

而且我生产的完整代码如下

FriendPickerApplication.java *

package com.facebook.samples.friendpicker; 

import android.app.Application; 
import com.facebook.model.GraphUser; 

import java.util.List; 

    // We use a custom Application class to store our minimal state data (which users have been selected). 
    // A real-world application will likely require a more robust data model. 
    public class FriendPickerApplication extends Application { 
     private List<GraphUser> selectedUsers; 

     public List<GraphUser> getSelectedUsers() { 
      return selectedUsers; 
     } 

     public void setSelectedUsers(List<GraphUser> selectedUsers) { 
      this.selectedUsers = selectedUsers; 
     } 
    }<br> 

参考FriendPickerSampleActivity.java

package com.facebook.samples.friendpicker; 
import android.app.AlertDialog; 
import android.content.DialogInterface; 
import android.content.Intent; 
import android.os.Bundle; 
import android.support.v4.app.FragmentActivity; 
import android.text.TextUtils; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TextView; 
import com.facebook.AppEventsLogger; 
import com.facebook.Session.NewPermissionsRequest; 
import com.facebook.SessionState; 
import com.facebook.UiLifecycleHelper; 
import com.facebook.model.GraphUser; 
import com.facebook.Session; 
import java.util.ArrayList; 
import java.util.Collection; 
import java.util.List; 

public class FriendPickerSampleActivity extends FragmentActivity { 
    private static final List<String> PERMISSIONS = new ArrayList<String>() { 
     { 
      add("user_friends"); 
      add("public_profile"); 
     } 
    }; 
    private static final int PICK_FRIENDS_ACTIVITY = 1; 
    private Button pickFriendsButton; 
    private TextView resultsTextView; 
    private UiLifecycleHelper lifecycleHelper; 
    boolean pickFriendsWhenSessionOpened; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     resultsTextView = (TextView) findViewById(R.id.resultsTextView); 
     pickFriendsButton = (Button) findViewById(R.id.pickFriendsButton); 
     pickFriendsButton.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View view) { 
       onClickPickFriends(); 
      } 
     }); 

     lifecycleHelper = new UiLifecycleHelper(this, new Session.StatusCallback() { 
      @Override 
      public void call(Session session, SessionState state, Exception exception) { 
       onSessionStateChanged(session, state, exception); 
      } 
     }); 
     lifecycleHelper.onCreate(savedInstanceState); 

     ensureOpenSession(); 
    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 

     // Update the display every time we are started. 
     displaySelectedFriends(RESULT_OK); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 

     // Call the 'activateApp' method to log an app event for use in analytics and advertising reporting. Do so in 
     // the onResume methods of the primary Activities that an app may be launched into. 
     AppEventsLogger.activateApp(this); 
    } 

    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     switch (requestCode) { 
      case PICK_FRIENDS_ACTIVITY: 
       displaySelectedFriends(resultCode); 
       break; 
      default: 
       Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data); 
       break; 
     } 
    } 

    private boolean ensureOpenSession() { 
     if (Session.getActiveSession() == null || 
       !Session.getActiveSession().isOpened()) { 
      Session.openActiveSession(
        this, 
        true, 
        PERMISSIONS, 
        new Session.StatusCallback() { 
         @Override 
         public void call(Session session, SessionState state, Exception exception) { 
          onSessionStateChanged(session, state, exception); 
         } 
        }); 
      return false; 
     } 
     return true; 
    } 

    private boolean sessionHasNecessaryPerms(Session session) { 
     if (session != null && session.getPermissions() != null) { 
      for (String requestedPerm : PERMISSIONS) { 
       if (!session.getPermissions().contains(requestedPerm)) { 
        return false; 
       } 
      } 
      return true; 
     } 
     return false; 
    } 

    private List<String> getMissingPermissions(Session session) { 
     List<String> missingPerms = new ArrayList<String>(PERMISSIONS); 
     if (session != null && session.getPermissions() != null) { 
      for (String requestedPerm : PERMISSIONS) { 
       if (session.getPermissions().contains(requestedPerm)) { 
        missingPerms.remove(requestedPerm); 
       } 
      } 
     } 
     return missingPerms; 
    } 

    private void onSessionStateChanged(final Session session, SessionState state, Exception exception) { 
     if (state.isOpened() && !sessionHasNecessaryPerms(session)) { 
      AlertDialog.Builder builder = new AlertDialog.Builder(this); 
      builder.setMessage(R.string.need_perms_alert_text); 
      builder.setPositiveButton(
        R.string.need_perms_alert_button_ok, 
        new DialogInterface.OnClickListener() { 
         @Override 
         public void onClick(DialogInterface dialog, int which) { 
          session.requestNewReadPermissions(
            new NewPermissionsRequest(
              FriendPickerSampleActivity.this, 
              getMissingPermissions(session))); 
         } 
        }); 
      builder.setNegativeButton(
        R.string.need_perms_alert_button_quit, 
        new DialogInterface.OnClickListener() { 
         @Override 
         public void onClick(DialogInterface dialog, int which) { 
          finish(); 
         } 
        }); 
      builder.show(); 
     } else if (pickFriendsWhenSessionOpened && state.isOpened()) { 
      pickFriendsWhenSessionOpened = false; 

      startPickFriendsActivity(); 
     } 
    } 

    private void displaySelectedFriends(int resultCode) { 
     String results = ""; 
     FriendPickerApplication application = (FriendPickerApplication) getApplication(); 

     Collection<GraphUser> selection = application.getSelectedUsers(); 
     if (selection != null && selection.size() > 0) { 
      ArrayList<String> names = new ArrayList<String>(); 
      for (GraphUser user : selection) { 
       names.add(user.getName()); 
      } 
      results = TextUtils.join(", ", names); 
     } else { 
      results = "<No friends selected>"; 
     } 

     resultsTextView.setText(results); 
    } 

    private void onClickPickFriends() { 
     startPickFriendsActivity(); 
    } 

    private void startPickFriendsActivity() { 
     if (ensureOpenSession()) { 
      Intent intent = new Intent(this, PickFriendsActivity.class); 
      // Note: The following line is optional, as multi-select behavior is the default for 
      // FriendPickerFragment. It is here to demonstrate how parameters could be passed to the 
      // friend picker if single-select functionality was desired, or if a different user ID was 
      // desired (for instance, to see friends of a friend). 
      PickFriendsActivity.populateParameters(intent, null, true, true); 
      startActivityForResult(intent, PICK_FRIENDS_ACTIVITY); 
     } else { 
      pickFriendsWhenSessionOpened = true; 
     } 
    } 
} <br> 

PickFriendsActivity.java

package com.facebook.samples.friendpicker; 

import android.content.Intent; 
import android.os.Bundle; 
import android.support.v4.app.FragmentActivity; 
import android.support.v4.app.FragmentManager; 
import android.widget.Toast; 
import com.facebook.FacebookException; 
import com.facebook.model.GraphUser; 
import com.facebook.widget.FriendPickerFragment; 
import com.facebook.widget.PickerFragment; 

import java.util.List; 

public class PickFriendsActivity extends FragmentActivity { 
    FriendPickerFragment friendPickerFragment; 

    public static void populateParameters(Intent intent, String userId, 
      boolean multiSelect, boolean showTitleBar) { 
     intent.putExtra(FriendPickerFragment.USER_ID_BUNDLE_KEY, userId); 
     intent.putExtra(FriendPickerFragment.MULTI_SELECT_BUNDLE_KEY, 
       multiSelect); 
     intent.putExtra(FriendPickerFragment.SHOW_TITLE_BAR_BUNDLE_KEY, 
       showTitleBar); 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.pick_friends_activity); 

     FragmentManager fm = getSupportFragmentManager(); 

     if (savedInstanceState == null) { 
      // First time through, we create our fragment programmatically. 
      final Bundle args = getIntent().getExtras(); 
      friendPickerFragment = new FriendPickerFragment(args); 
      fm.beginTransaction() 
        .add(R.id.friend_picker_fragment, friendPickerFragment) 
        .commit(); 
     } else { 
      // Subsequent times, our fragment is recreated by the framework and 
      // already has saved and 
      // restored its state, so we don't need to specify args again. (In 
      // fact, this might be 
      // incorrect if the fragment was modified programmatically since it 
      // was created.) 
      friendPickerFragment = (FriendPickerFragment) fm 
        .findFragmentById(R.id.friend_picker_fragment); 
     } 

     friendPickerFragment 
       .setOnErrorListener(new PickerFragment.OnErrorListener() { 
        @Override 
        public void onError(PickerFragment<?> fragment, 
          FacebookException error) { 
         PickFriendsActivity.this.onError(error); 
        } 
       }); 

     friendPickerFragment 
       .setOnDoneButtonClickedListener(new PickerFragment.OnDoneButtonClickedListener() { 
        @Override 
        public void onDoneButtonClicked(PickerFragment<?> fragment) { 
         // We just store our selection in the Application for 
         // other activities to look at. 
         FriendPickerApplication application = (FriendPickerApplication) getApplication(); 
         application.setSelectedUsers(friendPickerFragment 
           .getSelection()); 

         setResult(RESULT_OK, null); 
         finish(); 
        } 
       }); 
    } 

    private void onError(Exception error) { 
     String text = getString(R.string.exception, error.getMessage()); 
     Toast toast = Toast.makeText(this, text, Toast.LENGTH_SHORT); 
     toast.show(); 
    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 
     try { 
      FriendPickerApplication application = (FriendPickerApplication) getApplication(); 
      List<GraphUser> selectedUsers = application.getSelectedUsers(); 
      if (selectedUsers != null && !selectedUsers.isEmpty()) { 
       friendPickerFragment.setSelection(selectedUsers); 
      } 
      // Load data, unless a query has already taken place. 
      friendPickerFragment.loadData(false); 
     } catch (Exception ex) { 
      onError(ex); 
     } 
    } 
}<br> 

AndroidManifest.xml中

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.facebook.samples.friendpicker" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk android:minSdkVersion="8" /> 

    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

    <application 
     android:name=".FriendPickerApplication" 
     android:icon="@drawable/icon" 
     android:label="@string/app_name" 
     android:theme="@android:style/Theme.NoTitleBar" > 
     <activity 
      android:name="FriendPickerSampleActivity" 
      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="PickFriendsActivity" 
      android:label="Pick Friends" > 
     </activity> 
     <activity 
      android:name="com.facebook.LoginActivity" 
      android:label="@string/app_name" 
      android:theme="@android:style/Theme.Translucent.NoTitleBar" /> 

     <meta-data 
      android:name="com.facebook.sdk.ApplicationId" 
      android:value="@string/app_id" /> 

     <provider 
      android:name="com.facebook.NativeAppCallContentProvider" 
      android:authorities="com.facebook.app.NativeAppCallContentProvider1441068969495032" 
      android:exported="true" /> 
    </application> 

</manifest> 
+0

我也面临同样的问题,任何一个人都可以把它解决这个问题。 – sd33din90

回答

9

了长期的斗争,我发现我自己的解决了以上问题之后。 Facebook最近发布了他们的新SDK以提高安全级别。在您的应用中使用Facebook SDK有一些要求。

  1. 的应用程序应提交发送,需要通过Facebook的批准在里面Facebook的使用,以使自己的应用程序,以显示朋友的细节,访问位置和其他特殊权限审批手续与Google Play中的应用商店类似。

  2. 该应用程序必须在Google Play中列出,或者您可以将其作为测试用户(即Google Play中的测试版)进行整合。

  3. 应用程序应该有一个正确的包名称,启动活动,域名,网站的网址和电子邮件。

  4. 应用程序ID注册必须必须为用户在不同的机器

  5. 发展的基本应用信息来生成应用程序的名称散列键匹配,包括截图描述,和应用标志需要添加

  6. 成功获得批准后,在您的应用程序名称附近将显示“活动”符号。

我希望这将是为别人有用

More information on Facebook site

+0

感谢您的宝贵答案。真的,它会帮助谁正在寻找更新的Facebook SDK中的问题。 – sd33din90

+0

雅我从你的答复得到解决方案 –

+0

如何获得我们的应用程序的批准? – Riser

7

花了好几个小时试图解决此之后,我想补充的人还在找以下内容:

  1. 唯一的朋友,你将与user_friend权限列表中看到的是其他用户已登录并批准了您的应用。即如果没有其他人使用它,你将在列表中没有人(我知道,如果你全部阅读,这是显而易见的)
  2. 测试这个最简单的方法是设置一个测试应用程序,添加测试用户在“角色”下面的facebook的开发界面中,确保测试用户是朋友,然后在您的应用中使用每个用户的登录。只有这样他们才会出现在名单中。
  3. 除非特意要求,否则您的应用程序将不具有user_friends权限(但您不需要使用Facebook审阅此内容,因为它是基本权限的一部分) - 我将它添加到了onCreateView中飞溅段(从SDK中Scrumptios /登录样品)是这样的:

    LoginButton loginButton = (LoginButton) view.findViewById(R.id.login_button); 
    loginButton.setReadPermissions(Arrays.asList("user_friends")); 
    
  4. 使用Facebook测试用户界面登录Facebook上为您的测试用户来验证他们已经接受了正确的权限(下应用)。

+0

欢迎来到StackOverflow Jonas。作为新用户,这个答案非常好。但我仍然建议您访问[帮助中心](http://stackoverflow.com/help)。好一个:) – afzalex

+0

谢谢!会做。 – Jonas

相关问题