Android 如何通过SharedReferences获取Facebook用户档案(id、姓名、电子邮件和图片)并在其他活动中使用
我有一个应用程序,使用Facebook登录,然后转到另一个活动 首先,我检查了正确的登录,工作正常 然后,我将个人资料的日期保存在一个字符串数组列表中,然后保存在SharedReferences上 这是我的第一个活动(登录活动)的代码Android 如何通过SharedReferences获取Facebook用户档案(id、姓名、电子邮件和图片)并在其他活动中使用,android,sharedpreferences,facebook-login,Android,Sharedpreferences,Facebook Login,我有一个应用程序,使用Facebook登录,然后转到另一个活动 首先,我检查了正确的登录,工作正常 然后,我将个人资料的日期保存在一个字符串数组列表中,然后保存在SharedReferences上 这是我的第一个活动(登录活动)的代码 导入android.content.DialogInterface; 导入android.content.Intent; 导入android.content.pm.PackageInfo; 导入android.content.pm.PackageManager;
导入android.content.DialogInterface;
导入android.content.Intent;
导入android.content.pm.PackageInfo;
导入android.content.pm.PackageManager;
导入android.support.v7.app.AppActivity;
导入android.os.Bundle;
导入android.util.Base64;
导入android.util.Log;
导入android.widget.ImageView;
导入android.widget.TextView;
导入android.widget.Toast;
导入com.bumptech.glide.glide;
导入com.facebook.CallbackManager;
导入com.facebook.facebook回调;
导入com.facebook.facebook异常;
导入com.facebook.FacebookSdk;
导入com.facebook.GraphRequest;
导入com.facebook.GraphResponse;
导入com.facebook.appevents.AppEventsLogger;
导入com.facebook.login.LoginResult;
导入com.facebook.login.widget.LoginButton;
导入org.json.JSONException;
导入org.json.JSONObject;
导入java.net.MalformedURLException;
导入java.net.URL;
导入java.security.MessageDigest;
导入java.security.NoSuchAlgorithmException;
导入java.security.Signature;
导入java.util.array;
公共类MainActivity扩展了AppCompatActivity{
登录按钮登录按钮FB;
CallbackManager CallbackManager;
列表配置文件=新的ArrayList();;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sdkinInitialize(getApplicationContext());
AppEventsLogger.activateApp(此);
LoginManager.getInstance().logOut();
loginButtonfb=(LoginButton)findviewbyd(R.id.login_按钮);
//启动callbackmanager
callbackManager=callbackManager.Factory.create();
//获得获取公共配置文件、电子邮件、id和好友的权限
loginButtonfb.setReadPermissions(Arrays.asList(“public_profile”、“user_friends”、“email”);
//按钮的寄存器响应
registerCallback(callbackManager,newfacebookcallback()){
@凌驾
成功时公共无效(LoginResult LoginResult){
GraphRequest request=GraphRequest.NewMereRequest(loginResult.getAccessToken(),new GraphRequest.GraphJSONObjectCallback()){
@凌驾
未完成公共无效(JSONObject对象,GraphResponse响应){
Log.d(“res”,object.toString());
Log.d(“res_obj”,response.toString());
试一试{
stringid=object.getString(“id”);
试一试{
URL配置文件\u pic=新URL(“https://graph.facebook.com/“+id+”/picture?type=large”);
Log.i(“profile_pic”,profile_pic+”);
String f_name=object.getString(“first_name”);
String l_name=object.getString(“last_name”);
字符串名称=f_名称+“”+l_名称;
String email=object.getString(“email”);
字符串image=profile_pic.toString();
Log.d(“数据”,电子邮件+姓名+图像+id);
String type=“facebook”;
//将数据保存到arraylist中
添加(id);
添加(姓名);
添加(电子邮件);
添加(图像);
//保存到SharedReferences中
StringBuilder StringBuilder=新的StringBuilder();
用于(字符串s:profile){
stringBuilder.append;
stringBuilder.append(“,”);
}
SharedReferences sharpref=getSharedReferences(“ProfileList”,0);
SharedReferences.Editor=sharpref.edit();
putString(“ProfileList”,stringBuilder.toString());
commit();
如果(电子邮件==null){
}
}捕获(格式错误){
e、 printStackTrace();
}
}捕获(JSONException e){
e、 printStackTrace();
}
}
});
Bundle参数=新Bundle();
parameters.putString(“字段”、“id、名字、姓氏、电子邮件、性别”);
请求。设置参数(参数);
request.executeAsync();
goIndexScreen();
}
@凌驾
公开作废{
Toast.makeText(getApplicationContext(),“Has cancelado el-inicio de sesión”,Toast.LENGTH_LONG.show();
}
@凌驾
public void onError(facebook异常错误){
Toast.makeText(getApplicationContext(),“Error al conectar con Facebook”,Toast.LENGTH_LONG.show();
}
});
}
//更正回调所需的方法
@凌驾
受保护的void onActivityResult(int请求代码、int结果代码、意图数据){
callbackManager.onActivityResult(请求代码、结果代码、数据);
}
//方法转到下一个活动
私有void goIndexScreen(){
意向意向=新意向(此,Index.class);
intent.addFlags(intent.FLAG_活动_清除_顶部| intent.FLAG_活动_清除_任务| intent.FLAG_活动_新任务);
星触觉(意向);
}
}
这是下一个活动的代码。这是一个导航抽屉活动。
首先,我创建一个视图并指定一个headerview。然后,加载
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Base64;
import android.util.Log;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.bumptech.glide.Glide;
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.appevents.AppEventsLogger;
import com.facebook.login.LoginResult;
import com.facebook.login.widget.LoginButton;
import org.json.JSONException;
import org.json.JSONObject;
import java.net.MalformedURLException;
import java.net.URL;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.Signature;
import java.util.Arrays;
public class MainActivity extends AppCompatActivity {
LoginButton loginButtonfb;
CallbackManager callbackManager;
List<String> profile=new ArrayList<>();;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FacebookSdk.sdkInitialize(getApplicationContext());
AppEventsLogger.activateApp(this);
LoginManager.getInstance().logOut();
loginButtonfb=(LoginButton)findViewById(R.id.login_button);
// initiate callbackmanager
callbackManager = CallbackManager.Factory.create();
//get permision to get public profile,email,id,and friends
loginButtonfb.setReadPermissions(Arrays.asList("public_profile","user_friends","email"));
//register response of button
loginButtonfb.registerCallback(callbackManager, 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.d("res", object.toString());
Log.d("res_obj", response.toString());
try {
String id = object.getString("id");
try {
URL profile_pic = new URL("https://graph.facebook.com/" + id + "/picture?type=large");
Log.i("profile_pic", profile_pic + "");
String f_name = object.getString("first_name");
String l_name = object.getString("last_name");
String name = f_name + " " + l_name;
String email = object.getString("email");
String image = profile_pic.toString();
Log.d("data", email + name + image+id);
String type = "facebook";
//Save the data into the arraylist
profile.add(id);
profile.add(name);
profile.add(email);
profile.add(image);
//save into sharedpreferences
StringBuilder stringBuilder = new StringBuilder();
for (String s:profile){
stringBuilder.append(s);
stringBuilder.append(",");
}
SharedPreferences sharpref = getSharedPreferences("ProfileList",0);
SharedPreferences.Editor editor = sharpref.edit();
editor.putString("ProfileList", stringBuilder.toString());
editor.commit();
if (email == null) {
}
} catch (MalformedURLException e) {
e.printStackTrace();
}
} catch (JSONException e) {
e.printStackTrace();
}
}
});
Bundle parameters = new Bundle();
parameters.putString("fields", "id, first_name, last_name, email,gender");
request.setParameters(parameters);
request.executeAsync();
goIndexScreen();
}
@Override
public void onCancel() {
Toast.makeText(getApplicationContext(),"Has cancelado el inicio de sesión",Toast.LENGTH_LONG).show();
}
@Override
public void onError(FacebookException error) {
Toast.makeText(getApplicationContext(),"Error al conectar con Facebook",Toast.LENGTH_LONG).show();
}
});
}
//method necesary to correct callback
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
callbackManager.onActivityResult(requestCode,resultCode,data);
}
//method to go to next activity
private void goIndexScreen() {
Intent intent=new Intent(this,Index.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
public class Index extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener {
private ImageView ivprofile;
private TextView tvname;
private TextView tvemail;
private TextView tvidnumber;
private String picprofile;
private String name;
private String idnumber;
private String email;
final List<String> profile = new ArrayList<String>();
private View headerview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_index);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.addDrawerListener(toggle);
toggle.syncState();
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
//create a headerview to conect to header of left menu
headerview=navigationView.getHeaderView(0);
ivprofile=(ImageView)headerview.findViewById(R.id.imageProfile);
tvname=(TextView)headerview.findViewById(R.id.fullName);
tvemail=(TextView)headerview.findViewById(R.id.email);
tvidnumber=(TextView) headerview.findViewById(R.id.idNumber);
//check if session is already connected
if(AccessToken.getCurrentAccessToken()==null){
goLoginScreen();
}
//Load file saved by sharedpreferences into a new arraylist
final SharedPreferences sharpref = getSharedPreferences("ProfileList",0);
String Items = sharpref.getString("ProfileList","");
String [] listItems = Items.split(",");
for (int i=0;i<listItems.length;i++){
profile.add(listItems[i]);
}
//get the profile
idnumber=profile.get(0);
name=profile.get(1);
email=profile.get(2);
picprofile=profile.get(3);
tvname.setText(name);
tvidnumber.setText(idnumber);
tvemail.setText(email);
Glide.with(this).load(picprofile).into(ivprofile);
Log.d("ArrayPerfil", name+email+idnumber+picprofile);
}
@Override
public void onBackPressed() {
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
} else {
super.onBackPressed();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.index, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
// Handle navigation view item clicks here.
int id = item.getItemId();
if (id == R.id.nav_camera) {
// Handle the camera action
} else if (id == R.id.nav_gallery) {
} else if (id == R.id.nav_slideshow) {
} else if (id == R.id.nav_manage) {
} else if (id == R.id.nav_share) {
} else if (id == R.id.nav_send) {
}else if (id == R.id.nav_logout) {
LoginManager.getInstance().logOut();
goLoginScreen();
}
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
}
private void goLoginScreen() {
Intent intent=new Intent(this,MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
public void setFacebookConnection() {
LoginManager.getInstance().logOut();
List<String> permissionNeeds = Arrays.asList("public_profile, email");
LoginManager.getInstance().logInWithReadPermissions(mActivity, permissionNeeds);
FacebookSdk.sdkInitialize(mActivity);
callbackManager = CallbackManager.Factory.create();
LoginManager.getInstance().registerCallback(callbackManager, 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.d("res", object.toString());
Log.d("res_obj", response.toString());
try {
String id = object.getString("id");
try {
URL profile_pic = new URL("https://graph.facebook.com/" + id + "/picture?width=200&height=150");
Log.i("profile_pic", profile_pic + "");
String f_name = object.getString("first_name");
String l_name = object.getString("last_name");
String name = f_name + " " + l_name;
String email = object.getString("email");
String image = profile_pic.toString();
Log.d("data", email + name + image);
String type = "facebook";
if (email == null) {
}
} catch (MalformedURLException e) {
e.printStackTrace();
}
} catch (JSONException e) {
e.printStackTrace();
}
}
});
Bundle parameters = new Bundle();
parameters.putString("fields", "id, first_name, last_name, email,gender");
request.setParameters(parameters);
request.executeAsync();
}
@Override
public void onCancel() {
Log.d("fb_exception", "cancel by user");
}
@Override
public void onError(FacebookException exception) {
Log.d("fb_exception", exception.toString());
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
callbackManager.onActivityResult(requestCode, resultCode, data);
super.onActivityResult(requestCode, resultCode, data);
}
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
headerView = navigationView.getHeaderView(0);
tvUsername = (Textview) headerView.findViewById(R.id.username_textview_id);
profile_image = (Textview) headerView.findViewById(R.id.profile_image);
/**
* this method used to user login with facebook.
*/
private void loginWithFacebook() {
mLoginFbButton.setReadPermissions("public_profile", "email");
mLoginFbButton.setFragment(this);
mLoginFbButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
// App code
if (Profile.getCurrentProfile() == null) {
mProfileTracker = new ProfileTracker() {
@Override
protected void onCurrentProfileChanged(Profile profile, Profile profile2) {
// here getting fb user profile object.
}
};
} else {
registerUsingFaceBook(Profile.getCurrentProfile());
}
}
@Override
public void onCancel() {
}
@Override
public void onError(FacebookException exception) {
}
});
}