1

我正在使用面向Android的Facebook SDK以允许用户注册和使用应用程序。我想获得一些关于用户的基本信息,如用户名和电子邮件。无论如何,我有问题,因为我试图获取用户电子邮件时,得到空指针异常。面向Android请求电子邮件许可的Facebook SDK 3.7

String email = user.getProperty("email").toString(); 

我假设我得到这个错误,因为我没有请求电子邮件许可。我该怎么做?

这里是完整的代码

public class RegisterActivity extends ActionBarActivity{ 

Button btnFacebook; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_register); 

    getSupportActionBar().hide(); 

    btnFacebook = (Button) findViewById(R.id.btn_facebook); 


    btnFacebook.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View arg0) { 
      Log.d("FACEBOOK", "Prije sesije"); 
      // start Facebook Login 
         Session.openActiveSession(RegisterActivity.this, true, new Session.StatusCallback() { 
          // callback when session changes state 
          @SuppressWarnings("deprecation") 
          @Override 
          public void call(Session session, SessionState state, 
            Exception exception) { 
           Log.d("FACEBOOK", "U call"); 
           if(session.isOpened()){      

            Log.d("FACEBOOK", "ako je sesija otvorena"); 

            // make request to the /me API 
            Request.executeMeRequestAsync(session, new Request.GraphUserCallback() { 

             @Override 
             public void onCompleted(GraphUser user, Response response) { 
              Log.d("FACEBOOK", "onCompleted"); 

              if(user != null){ 
               Log.d("FACEBOOK", "user razlicit od null"); 
               String email = user.getProperty("email").toString(); 
               Toast.makeText(getApplicationContext(), "Ime "+user.getUsername().toString()+ "Email "+ email , 
                 Toast.LENGTH_SHORT).show(); 

               String userId = user.getId(); 


               //new DownloadImageTask(ivProfile).execute("http://graph.facebook.com/"+userId+"/picture?type=large"); 



               Log.d("ID", userId); 



              } 
              Log.d("ID", user.getId()); 


             } 
            }); 
           } 
           Log.d("FACEBOOK", "nije u sesisji"); 


          } 

         }); 

     } 
    }); 

} 

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

回答

10

获取第一权限

private static final List<String> PERMISSIONS = Arrays.asList(
     "email","user_location"); 

的甲基OD用于获取用户信息

 Session.openActiveSession(RegisterActivity.this, true, new Session.StatusCallback() { 

     // callback when session changes state 
     @Override 
     public void call(Session session, SessionState state, 
       Exception exception) { 
      /* 
      * Session.getActiveSession().onActivityResult(activity1,64206, 
      * -1,activity1.getIntent()); 
      */ 

      if (session.isOpened()) { 

       List<String> permissions = session.getPermissions(); 
       if (!isSubsetOf(PERMISSIONS, permissions)) { 
        Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest(
          RegisterActivity.this, PERMISSIONS); 
        session.requestNewReadPermissions(newPermissionsRequest); 
        return; 
       } 
       // make request to the /me API 
       Request.newMeRequest(session, new GraphUserCallback() { 

        @Override 
        public void onCompleted(GraphUser user, Response response) { 
         // TODO Auto-generated method stub 
         Log.d("",""+user); 
         try { 

          name=user.getName(); 
          email=user.getProperty("email").toString(); 
          location=(user.getLocation().getProperty("name").toString()); 

         } catch (Exception e) { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
         } 

        } 
       }).executeAsync(); 

      } 
     } 
    }); 

isSubsetof方法

private boolean isSubsetOf(Collection<String> subset, 
     Collection<String> superset) { 
    for (String string : subset) { 
     if (!superset.contains(string)) { 
      return false; 
     } 
    } 
    return true; 
} 

把这个代码在onActivityResult

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

    Log.d("Activity result"," "+requestCode+" "+resultCode+" "+data.toString()); 
    Session.getActiveSession().onActivityResult(this, requestCode, 
      resultCode, data); 
} 

互联网许可,不得以清单

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

申报Facebook的登录活动清单中

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

是该解决方案的工作? –

+0

该解决方案运行良好。 – Zookey

+0

当我再添加一个权限(生日)如下,它不工作。加载RegisterActivity几次。 –

0

嘿,你可以试试这个方法...

session.openForRead(new Session.OpenRequest(this).setPermissions(Arrays.asList("id", "name", "picture","installed")).setCallback(statusCallback)); 
相关问题