自定义共享对话框,不适用于某些应用程序

时间:2015-05-25 16:57:17

标签: android android-intent dialog share evernote

我已经在我的Android应用程序中实现了自定义共享对话框。我正在共享图像,有趣的是它不适用于Evernote应用程序。我可以通过默认方式与Evernote共享。但它不能与此代码一起使用。我仅在Evernote应用程序中体验过这一点。

这是我的代码:

public void doShareCustomDialog() {
    Bitmap curBitmap = ((ImagePagerAdapter) viewPager.getAdapter())
            .getCurrentBitmap();
    final Intent imageIntent = new Intent();
    imageIntent.setAction(Intent.ACTION_SEND);
    imageIntent.setType("image/jpeg");
    imageIntent.putExtra(Intent.EXTRA_STREAM,
            getImageUri(getActivity(), curBitmap));

    final Dialog dialog = new Dialog(getActivity());
    dialog.setTitle("Choose application:");
    dialog.getWindow().setBackgroundDrawable(
            new ColorDrawable(R.color.black_overlay));
    dialog.setCanceledOnTouchOutside(true);
    ListView lv = new ListView(getActivity());
    dialog.setContentView(lv);
    dialog.show();

    PackageManager pm = getActivity().getPackageManager();
    List<ResolveInfo> launchables = pm
            .queryIntentActivities(imageIntent, 0);
    Collections
            .sort(launchables, new ResolveInfo.DisplayNameComparator(pm));

    final AppAdapter adapter = new AppAdapter(pm, launchables);
    lv.setAdapter(adapter);
    lv.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
            ResolveInfo launchable = adapter.getItem(position);
            ActivityInfo activity = launchable.activityInfo;
            ComponentName name = new ComponentName(
                    activity.applicationInfo.packageName, activity.name);
            imageIntent.addCategory(Intent.CATEGORY_LAUNCHER);
            imageIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
                    | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
            imageIntent.setComponent(name);
            startActivity(imageIntent);
        }
    });

}

这是getUri()方法:

public Uri getImageUri(Context inContext, Bitmap inImage) {
    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
    String path = Images.Media.insertImage(inContext.getContentResolver(),
            inImage, "Title", null);
    latestSharedImageURI = Uri.parse(path);
    return latestSharedImageURI;
}

这里的代码完全正常,但它没有自定义对话框,但是使用默认对话框。

public void doShare() {
    Bitmap curBitmap = ((ImagePagerAdapter) viewPager.getAdapter())
            .getCurrentBitmap();
    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_SEND);
    intent.setType("image/jpeg");
    intent.putExtra(Intent.EXTRA_STREAM,
            getImageUri(getActivity(), curBitmap));
    setShareIntent(intent);
    startActivity(Intent.createChooser(intent,
            getResources().getText(R.string.share_choose)));
}

1 个答案:

答案 0 :(得分:0)

首先我需要提一下我是一名Evernote员工。我尝试了你的代码片段,它可以工作。这取决于这种方法:

imageIntent.putExtra(Intent.EXTRA_STREAM,
        getImageUri(getActivity(), curBitmap));

您可能想要发布如何生成Uri。在我的测试中,如果您的文件位于应用程序的内部存储中,这肯定不起作用。如果文件存储在外部存储器上,那么如果Uri正确,则代码可以正常工作。

如果要从内部存储共享文件,则需要实现FileProvider并使用getUriForFile生成Uri。然后它与我的测试一起工作。