Android:使用Parse获取Facebook / Twitter个人资料图片

时间:2015-03-04 21:04:39

标签: android facebook facebook-graph-api parse-platform

您好我正在使用ParseLoginUi为我的Android应用程序,所以用户可以使用Facebook,Twitter和本地登录选项登录我的应用程序。 我希望我的用户能够添加/上传个人资料图片。现在当有人使用Facebook登录时,我获得该用户的facebook访问令牌并将其存储到我的解析数据中。但是我不知道如何获取该用户的facebook个人资料图片以及将其存储在我的解析数据库中的最佳方式(我应该将url保存为我的数据库中的String吗?如果用户上传了一个图像,该怎么办?他/她的设备)? 有人可以帮我解决这个问题。

2 个答案:

答案 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());
}