自定义共享对话框,不适用于某些应用
Custom share dialog,not working for some apps
我实现了一个自定义分享对话框,在我的android app.I 中分享图片,有趣的是它不适用于 Evernote application.I 默认情况下可以与 Evernote 分享 way.But 它不适用于此 code.I 仅在 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)));
}
我需要先说明一下,我是 Evernote 的员工。我试过你的代码片段,它可以工作。取决于这个方法:
imageIntent.putExtra(Intent.EXTRA_STREAM,
getImageUri(getActivity(), curBitmap));
您可能想 post 如何生成 Uri。在我的测试中,如果您的文件在应用程序的内部存储中,这肯定不起作用。如果文件存储在外部存储上,那么如果 Uri 正确,您的代码就可以工作。
如果您想共享内部存储中的文件,您需要实施 FileProvider and generate the Uri with getUriForFile。然后它适用于我的测试。
我实现了一个自定义分享对话框,在我的android app.I 中分享图片,有趣的是它不适用于 Evernote application.I 默认情况下可以与 Evernote 分享 way.But 它不适用于此 code.I 仅在 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)));
}
我需要先说明一下,我是 Evernote 的员工。我试过你的代码片段,它可以工作。取决于这个方法:
imageIntent.putExtra(Intent.EXTRA_STREAM,
getImageUri(getActivity(), curBitmap));
您可能想 post 如何生成 Uri。在我的测试中,如果您的文件在应用程序的内部存储中,这肯定不起作用。如果文件存储在外部存储上,那么如果 Uri 正确,您的代码就可以工作。
如果您想共享内部存储中的文件,您需要实施 FileProvider and generate the Uri with getUriForFile。然后它适用于我的测试。