您好我正在使用ParseLoginUi为我的Android应用程序,所以用户可以使用Facebook,Twitter和本地登录选项登录我的应用程序。 我希望我的用户能够添加/上传个人资料图片。现在当有人使用Facebook登录时,我获得该用户的facebook访问令牌并将其存储到我的解析数据中。但是我不知道如何获取该用户的facebook个人资料图片以及将其存储在我的解析数据库中的最佳方式(我应该将url保存为我的数据库中的String吗?如果用户上传了一个图像,该怎么办?他/她的设备)? 有人可以帮我解决这个问题。
答案 0 :(得分:2)
要获得用户的Facebook个人资料照片,您必须使用Facebook Android SDK V4(最新版本)。使用Facebook Android SDK获取图像后,您只需将URL存储为字符串,并将其与您的parseuser关联!要从用户设备获取图像,请使用具有startactivityforresult的意图。
确保您已配置Facebook Android SDK,或者以下所有说明对您没什么用处!
步骤1.使用Facebook SDK从Facebook获取个人资料图片 建议。这应该在通过Parse SDK登录Facebook用户后完成。
GraphJSONObjectCallback mCallback = new GraphJSONObjectCallback()
{
@Override
public void onCompleted(JSONObject mData, GraphResponse mResponse)
{
if(mResponse.getError() == null)
{
try
{
final JSONObject mPicture = mData.getJSONObject("picture");
final JSONObject mPictureData = mPicture.getJSONObject("data");
final boolean mSilhouette = mPictureData.getBoolean("is_silhouette");
**//this is the URL to the image that you want**
final String mImageUrl = mPictureData.getString("url");
}
catch (JSONException e)
{
//JSON Error, DEBUG
}
}
else
{
//Facebook GraphResponse error, DEBUG
}
}
};
Bundle mBundle = new Bundle();
mBundle.putString("fields", "picture");
GraphRequest mGetUserRequest = GraphRequest.newMeRequest(AccessToken.getCurrentAccessToken(), mCallback);
mGetUserRequest.setParameters(mBundle);
//if running this on the MAIN THREAD then use .executeAsync()
mGetUserRequest.executeAndWait();
现在你应该有String mImageUrl,所以你应该拥有IMAGE。布尔mSilhuoette让您知道是否正在使用默认的silhuoette。查看Facebook Android SDK文档了解更多信息。
第2步:将网址与用户关联
ParseUser mUser = ParseUser.getCurrentUser();
mUser.put("image", mImageUrl);
mUser.saveInBackground();
注意:您也可以自己下载图像并将其存储在ParseFile中。这取决于您打算在整个应用程序中使用此图像的方式。
步骤3:如果用户从他/她的设备上传图像,您可以使用具有startactivity的intent来允许用户选择图像。获取onActivityResult中的图像。将图像加载到位图中。将图像加载到位图后,将位图转换为parsefile并将该ParseFile与用户关联,您就完成了!我建议使用Picasso,以及显示与ParseUser关联的图像URL。您可以通过Google搜索Android Picasso找到有关Picasso的更多信息。
当您准备好允许用户从设备中选择图像时使用:
Image mImagePickerIntent = new Intent();
mImagePickerIntent.setType("image/*");
mImagePickerIntent.setAction(Intent.ACTION_GET_CONTENT);
final Intent mMainIntent = Intent.createChooser(mImagePickerIntent, "Pick Image");
startActivityForResult(mMainIntent, 1);
在onActivityResult中使用此
@Override
public void onActivityResult(int mRequestCode, int mResultCode, Intent mIntent)
{
super.onActivityResult(mRequestCode, mResultCode, mIntent);
if(mResultCode == Activity.RESULT_OK)
{
final Uri mImageUri = mIntent.getData();
//might be better to load bitmap with a Picasso Target (try/catch)
Bitmap mBitmap = Picasso.with(getActivity()).load(mImageUri).get();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
mBitmap.compress(Bitmap.CompressFormat.PNG, 100, bos);
final byte[] mData = bos.toByteArray();
mBitmap.recycle();
final ParseFile mPhotoFile = new ParseFile("image.png", mData);
mPhotoFile.saveInBackground();
final ParseUser mUser = ParseUser.getCurrentUser();
mUser.put("imageFile", mPhotoFile);
mUser.saveInBackground();
}
}
上面的代码不是最终的!它可以代表您为实现目标必须采取的工作快照!为简洁起见省略了一些内容,如空检查,try / catch块等。
答案 1 :(得分:0)
您可以从facebookId创建个人资料图片。
public static Uri getFacebookProfilePic(String fbId,int height, int width) {
Uri.Builder builder = new Uri.Builder().encodedPath(String.format("https://graph.facebook.com/%s/picture", fbId));
builder.appendQueryParameter("height", String.valueOf(height));
builder.appendQueryParameter("width", String.valueOf(width));
builder.appendQueryParameter("migration_overrides", "{october_2012:true}");
return Uri.parse(builder.toString());
}