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 等
我对 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 等