调用Facebook Graph API发图要求URL,Android本地仅存Uri如何解决
错误原因
你传入的本地content://格式Uri是设备本地的资源寻址路径,仅在你的手机内部可访问,Facebook Graph API的url参数要求传入公网可访问的HTTP/HTTPS地址,Facebook的服务器无法请求到你手机本地的资源,因此返回拉取图片失败的错误。你不需要将本地Uri转换为公网URL,直接用Facebook Android SDK提供的本地图片上传能力即可解决问题。
另外你的现有代码还存在端点调用错误:你当前调用的/{id}/picture是更新头像的接口,和你测试时用的发布相册图片的/{page_id}/photos接口不符,需要修正。
解决步骤
1. 先实现本地Uri转Bitmap的工具方法
// 从本地content Uri获取图片Bitmap private Bitmap getBitmapFromUri(Context context, Uri uri) throws IOException { return MediaStore.Images.Media.getBitmap(context.getContentResolver(), uri); }
2. 修改上传逻辑,使用SDK自带的上传照片接口
不要自己构造普通Post请求,直接用GraphRequest.newUploadPhotoRequest方法,该方法会自动把本地图片转成二进制流提交给接口,不需要传url参数:
private int postRandomData(Context context, Uri photoUri, String msg, List<PageEntity> pageEntities) { ArrayList<GraphRequest> requests = new ArrayList<>(); try { // 读取本地图片 Bitmap targetPhoto = getBitmapFromUri(context, photoUri); GraphRequest.Callback callback = response -> { if (response.getError() == null) { Log.e("response", response.toString()); // 上传成功后续逻辑 } else { Log.e("upload_fail", response.getError().getErrorMessage()); } }; for (PageEntity pageEntity : pageEntities) { AccessToken pageAccessToken = createAccessToken(pageEntity.getPageAccessToken(), pageEntity.getPageId()); // 构造上传照片请求,对应你测试的/{page_id}/photos端点 GraphRequest uploadRequest = GraphRequest.newUploadPhotoRequest( pageAccessToken, "/" + pageEntity.getPageId() + "/photos", targetPhoto, msg, // 发布的文案 null, // 无额外参数直接传null callback ); requests.add(uploadRequest); } GraphRequest.executeBatchAsync(requests); } catch (IOException e) { e.printStackTrace(); return -1; } return 0; }
注意事项
- 提前申请对应权限:读取本地图片需要申请安卓存储权限,发布公共主页内容需要你的Facebook应用申请
pages_manage_posts权限并通过审核。 - 如果图片体积较大,建议先做压缩再上传,避免超时或者上传失败。
内容的提问来源于stack exchange,提问作者Omar Shawky
相关产品推荐
相关产品推荐

