通过Intent从Android应用程序以编程方式在Facebook中共享图像

时间:2015-08-12 19:43:23

标签: java android facebook android-intent

我在Android 4.0.4上运行此代码。

// Create the new Intent using the 'Send' action.
Intent share = new Intent(Intent.ACTION_SEND);

// Set the MIME type
share.setType(type);

// Create the URI from the media
java.io.File media = new java.io.File(mediaPath);
Uri uri = Uri.fromFile(media);

// Add the URI and the caption to the Intent.
share.putExtra(Intent.EXTRA_STREAM, uri);
share.putExtra(Intent.EXTRA_TEXT, caption);

// Broadcast the Intent.
mActivity.startActivity(Intent.createChooser(share, "Share to"));

但是在Android 4.4.2上它崩溃了Facebook应用程序。 Facebook应用程序打开,图像未显示,FB应用程序已死亡。

在日志转储中,我注意到了这条消息:

E/JHEAD   ( 5850): can't open '/data/data/cz.volten.brili.android.free/files/product_preview_shared.jpg'
V/ContextImpl( 5850): ----- packageName = com.facebook.katana is NOT LOCKED -----

原因可能是某些安全限制,例如: FB应用程序无权访问应用程序文件夹中的图像,即使它是从intent?

调用的

如果是这样,应用程序之间共享图像的适当位置是什么?

我应该使用这样的东西:how to share image to facebook via intent

3 个答案:

答案 0 :(得分:1)

这是我通常使用的

    private void initShareIntent(String type) {
    boolean found = false;
    Intent share = new Intent(android.content.Intent.ACTION_SEND);
    share.setType("image/jpeg");

    // gets the list of intents that can be loaded.
    List<ResolveInfo> resInfo = getPackageManager().queryIntentActivities(share, 0);
    if (!resInfo.isEmpty()) {
        for (ResolveInfo info : resInfo) {
            if (info.activityInfo.packageName.toLowerCase().contains(type) ||
                    info.activityInfo.name.toLowerCase().contains(type)) {
                share.putExtra(Intent.EXTRA_TEXT, "Elevator Express");
                share.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new File(imagePath))); // Optional, just if you wanna share an image.
                share.setPackage(info.activityInfo.packageName);
                found = true;
                break;
            }
        }
        if (!found) {
                Toast.makeText(getApplicationContext(), "Facebook does not exist", Toast.LENGTH_SHORT).show();

            return;
        }
        startActivity(Intent.createChooser(share, "Select"));
    }
}

并将其称为:

iniShareIntent("face");

答案 1 :(得分:1)

  

原因可能是某些安全限制,例如: FB应用程序无权访问应用程序文件夹中的图像,即使它是从intent?

调用的

正确。该图片位于internal storage上,适用于您的应用。

  

如果是这样,应用程序之间共享图像的适当位置是什么?

您可以坚持使用内部存储,但您需要使用a FileProvider(可能还有my LegacyCompatCursorWrapper)来提供文件。 This sample app证明了这一点,尽管有PDF而不是图像。

或者,将文件放在external storage上。

  

我应该使用这样的东西:如何通过意图分享图像到脸书

与使用FileProvider相比,你可以,但这似乎有点矫枉过正。

答案 2 :(得分:0)

此代码对我有用。....这里的“ updateImage”是我的图像位置。

        if (isFacebookExist()) {


        if (hashClick.isChecked()) {


            SharePhoto sharePhoto = new SharePhoto.Builder()
                    .setBitmap(updateImage)
                    .build();


            if (ShareDialog.canShow(SharePhotoContent.class)) {
                SharePhotoContent content = new SharePhotoContent.Builder()
                        .addPhoto(sharePhoto)
                        .setShareHashtag(new ShareHashtag.Builder()
                                .setHashtag("#HashTag")
                                .build())
                        .build();
                shareDialog.show(content);
            }

        } else {

            SharePhoto sharePhoto = new SharePhoto.Builder()
                    .setBitmap(updateImage)
                    .build();


            if (ShareDialog.canShow(SharePhotoContent.class)) {
                SharePhotoContent content = new SharePhotoContent.Builder()
                        .addPhoto(sharePhoto)
                        .build();
                shareDialog.show(content);
            }

        }


    } else {
        showToast(" Facebook is not install.");
    }


private boolean isFacebookExist() {

    PackageManager pm = getPackageManager();
    try {
        PackageInfo info = pm.getPackageInfo("com.facebook.katana", PackageManager.GET_META_DATA);
    } catch (PackageManager.NameNotFoundException e) {
        return false;
    }
    return true;
}