与自定义“保存到图库”选项的共享图像意图

6
我将使用Android的默认共享意图与其他应用程序共享图像。但我想添加一个选项,例如保存到相册,该选项可以直接将该图像保存到媒体库、图像文件夹或我的应用文件夹中。
目前,我正在使用简单的代码来共享图像:
Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file));
shareIntent.setType("image/jpeg");
startActivity(Intent.createChooser(shareIntent, "Share to"));

当我尝试从个人资料图片中使用WhatsApp的分享按钮时,出现了一个“保存到相册”选项。现在,我知道这不是Android预先构建的。这是WhatsApp添加的手动操作,某种程度上将图像保存到特定路径。长按“保存到相册”按钮会显示该操作属于WhatsApp应用程序。因此,这意味着WhatsApp已经为其编写了一些逻辑。它是带有附加自定义操作“保存到相册”的相同默认ACTION_SEND意图和image/* MIME类型。

这很好。我也想为我的应用程序添加这种逻辑。我可以注册<intent-filter>来处理此操作,但它将全局接受来自任何应用程序的任何图像以便保存到相册。

我该如何添加手动操作以供我的分享意图或<intent-filter>活动使用,使其仅针对我的应用程序(只对我的应用程序可见),并达到将图像保存到相册的目的?


这个问题最终解决了吗?我遇到了类似的问题。 - gom1
1个回答

7
以下代码片段执行以下操作: 首先,我们查询系统的IntentActivities,这些IntentActivities可以处理我们的共享意图。之后,我们将构建一个LabeledIntents列表。最后,我们将自定义的共享操作添加到此列表中,并将默认选择对话框呈现给用户。
public Intent getNativeShareIntent(final Context context) {
  final PackageManager pm = context.getPackageManager();
  final Intent sendIntent = new Intent(Intent.ACTION_SEND);
  sendIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file));
  sendIntent.setType("image/jpeg");      
  List<ResolveInfo> resInfo = pm.queryIntentActivities(sendIntent, 0);
  List<LabeledIntent> intentList = new ArrayList<>();

  for (int i = 0; i < resInfo.size(); i++) {
        ResolveInfo ri = resInfo.get(i);
        String packageName = ri.activityInfo.packageName;         
        final Intent intent = new Intent();
        intent.setComponent(new ComponentName(packageName, ri.activityInfo.name));
        intent.setPackage(packageName);
        intent.setAction(Intent.ACTION_SEND);
        intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file));
        intent.setType("image/jpeg");      
        intentList.add(new LabeledIntent(intent, packageName, ri.loadLabel(pm),
              ri.getIconResource()));
  }

  // TODO Implement the method getSaveToGalleryIntent, 
  // Could be a simple intent linking to activity.
  intentList.add(getSaveToGalleryIntent(context));

  Intent openInChooser = Intent.createChooser(intentList.remove(0),
        "Share");
  LabeledIntent[] extraIntents = intentList.toArray(new LabeledIntent[intentList.size()]);
  openInChooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, extraIntents);
  return openInChooser;
}

 private Intent getSaveToGalleryIntent(final Context context, final Uri imgUrl) {
     final Intent intent = new Intent(context, SaveToGalleryActivity.class);
     intent.putExtra(SaveToGalleryActivity.EXTRA_KEY_CONTENT, imgUrl);
  return new LabeledIntent(intent, BuildConfig.APPLICATION_ID,
        "Save to gallery",
        R.drawable.ic_save_to_gallery);
 }

我们能否在点击保存到相册选项时调用一个方法(下载图像并保存到相册),而不是调用一个活动? - Sapna Sharma
你需要添加一个意图(Intent)。你不能直接使用一个 Intent 调用一个方法。但你可以尝试使用 Broadcastreceiver Intent 代替调用 Activity。 - Christopher

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接