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

kir*_*403 3 android image android-intent

我使用Android的默认共享意图将图像共享给其他应用程序.但我想添加一个选项Save to Gallery,将图像直接保存到媒体或图像或我的应用程序文件夹中的图库.

目前我使用简单的代码来共享图像:

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"));
Run Code Online (Sandbox Code Playgroud)

当我从个人资料图片中尝试WhatsApp的分享按钮时,可以选择" Save To Gallery"选项.现在,我开始知道,它不是预先构建的android.这是WhatsApp添加的手动操作,它以某种方式将图像保存到特定路径.在长按" Save to gallery"按钮显示,该动作是WhatsApp的应用程序.这意味着WhatsApp为它编写了一些逻辑.它ACTION_SENDimage/*mime类型具有相同的默认意图,并带有其他自定义操作" Save to Gallery".

那完全没问题.我也希望为我的应用添加这种逻辑.我可以注册<intent-filter>哪个可以处理此操作,但它将全局接受来自任何应用程序的任何图像以保存到图库.

如何为我的共享Intent或<intent-filter>活动添加手动操作,该操作仅适用于我的应用程序(仅限我的应用程序可见),并用于将图像保存到图库?

Chr*_*her 6

以下代码片段执行以下操作:首先,我们正在查询系统中的IntentActivities,它可以处理我们的Share-Intent.之后,我们构建了一个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);
 }
Run Code Online (Sandbox Code Playgroud)