Android ShareActionProvider with ViewPager 强制我保存图片

Android ShareActionProvider with ViewPager forces me save Image

我对 ShareActionProvider 有很大的疑问。我的应用程序就像一个使用 ViewPager 的画廊应用程序,它跟踪最喜欢的图像项目,并提供通过 ShareActionProvider 共享它们的可能性。 一切正常,除了我滚动到的任何图像都保存在我用来获取 Uri 的目录中。

这是我的代码

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    super.onCreateOptionsMenu(menu, inflater);
    menu.clear();
    inflater.inflate(R.menu.menu_fragement_gallery, menu);
    mMenu = menu;
    favoriteItem = mMenu.findItem(R.id.idItemFavoris);

    MenuItem item = (MenuItem) mMenu.findItem(R.id.idItemShashare);

    mShareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(item);

    initShareIntent();
}

private void initShareIntent() {
    if (mShareActionProvider != null) {
        Uri bmpUri = getLocalBitmapUri(mCurrentImage);
        Intent shareIntent = new Intent();
        shareIntent.setAction(Intent.ACTION_SEND);
        shareIntent.putExtra(Intent.EXTRA_STREAM, bmpUri);
        shareIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Test");

        shareIntent.setType("image/*");

        mShareActionProvider.setShareIntent(shareIntent);
    }
}
public Uri getLocalBitmapUri(ImageView imageView) {
    if(imageView != null){
        Drawable mDrawable = imageView.getDrawable();
        Bitmap mBitmap = ((BitmapDrawable) mDrawable).getBitmap();

        String path = MediaStore.Images.Media.insertImage(getActivity().getContentResolver(),
              mBitmap, "Image Description", null);

        Uri uri = Uri.parse(path);
        return uri;
    }
    return null;
}

我需要打电话给

getActivity().invalidateOptionsMenu();

每次我在 ViewPager 中实例化视图时

class GalleryViewPagerAdapter extends PagerAdapter {

    @Override
    public int getCount() {
        return listeOfPhotos.size();
    }

    @Override
    public View instantiateItem(ViewGroup container, int position) {
        mPhoto = listeOfPhotos.get(position);

        ImageLoader.getInstance()
                .displayImage(mPhoto.getUrl(), mCurrentImage, FragmentGallery.options, null, null);

        container.addView(mCurrentImage, LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);

        //Change the Favorite Icon and Invalidate Menu
        initIconFavorite();

        return mCurrentView;
    }

}

如果你们能帮我解决这个问题,我会很高兴。

谢谢

您调用了 initShareIntent,最终在您的每个 Fragment 中调用了 getLocalBitmapUri。那就是在图库中创建单独图像的图像。

我建议您停止使用 ShareActionProvider。 Google 停止在他们的应用程序中使用它。使用 ShareActionProvider 在用户想要共享它并单击共享按钮之前,您已经知道 URI 和共享意图。所以它变得有点难做。

您可以查看以下链接了解如何操作。您基本上必须在单击按钮而不是在 onCreate 回调中生成共享 Intent。 http://developer.android.com/training/sharing/send.html#send-binary-content https://github.com/codepath/android_guides/wiki/Sharing-Content-with-Intents

如果您自己使用普通的 ActionBar 按钮和触发共享对话框,您可以仅在用户想要共享图像时使用 getLocalBitmapUri 调用和创建本地 Bitmap

如果必须使用 ShareActionProvider,则不应重新创建新的本地 Bitmap。即使当您显示在线图像时,您也会将其缓存在正确的位置。该图像的本地副本已经存在于某处。您应该找到它并将其作为 URI 提供给 ShareActionProvider。当然,它应该 public 易于访问。因此,您可以将图像缓存文件夹设置在 public 文件夹中的某个位置,例如 sdcard 等

如果必须使用 ShareActionProvider,则不应重新创建新的本地位图。即使当您显示在线图像时,您也会将其缓存在正确的位置。该图像的本地副本已经存在于某处。您应该找到它并将其作为 URI 提供给 ShareActionProvider。当然,它应该 public 可以访问。因此,您可以将图像缓存文件夹设置在 public 文件夹中的某个位置,例如 sdcard 等