I am using folowing code below to share images to wanted apps, which works well for most of the apps, except viber. Whenever I am trying to share image to viber, viber crashes with folliwng error:
FATAL EXCEPTION: ThreadManager::idleTasksHandler
Process: com.viber.voip, PID: 16668
java.lang.IllegalArgumentException: column '_data' does not exist
at android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:303)
at android.database.CursorWrapper.getColumnIndexOrThrow(CursorWrapper.java:78)
at com.viber.voip.util.aw.a(SourceFile:238)
at com.viber.voip.util.aw.b(SourceFile:206)
at com.viber.voip.util.aw.a(SourceFile:141)
at com.viber.voip.util.b.n.a(SourceFile:1204)
at com.viber.voip.util.bm.run(SourceFile:207)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at com.viber.voip.be.dispatchMessage(SourceFile:32)
at android.os.Looper.loop(Looper.java:135)
at android.os.HandlerThread.run(HandlerThread.java:61)
at com.viber.voip.cj.run(SourceFile:100)
My Uriess looks like content://com.myapp.fileprovider/share_images/nxt_emoji_26.png
code
public class ShareSmile {
public static void share(Context context, int id, String selectedPackage) {
String name = context.getResources().getResourceEntryName(id);
try{
if (name.contains("ic_")) {
name = name.replace("ic_", "");
File imagePath = new File(context.getFilesDir(), "image_assets/smiles");
File newFile = new File(imagePath, name + ".png");
Uri contentUri =
FileProvider.getUriForFile(context, "com.myapp.fileprovider", newFile);
Intent shareIntent = shareImage(contentUri,context);
shareIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
if (TextUtils.isEmpty(selectedPackage)) {
//create chooser
Intent sendIntent= Intent.createChooser(shareIntent, context.getString(R.string.send_via));
sendIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(sendIntent);
} else {
//send to specific app
shareIntent.setPackage(selectedPackage);
context.startActivity(shareIntent);
}
}}catch (Exception e){
HashMap<String,Boolean> map = MyPrefs.getSupportedApss(context);
map.put(selectedPackage,false);
Toast.makeText(context, R.string.share_smile_error,Toast.LENGTH_LONG).show();
}
}
public static Intent shareImage(Uri uri,Context context) {
Intent shareIntent = new Intent(Intent.ACTION_SEND_MULTIPLE);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
shareIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
} else {
shareIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT);
}
shareIntent.setType("image/png");
ArrayList<Uri> streamUris = new ArrayList<>();
streamUris.add(uri);
shareIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, streamUris);
//grant permission to access fileprovider
List<ResolveInfo> resInfoList = context.getPackageManager()
.queryIntentActivities(shareIntent, PackageManager.MATCH_DEFAULT_ONLY);
for (ResolveInfo resolveInfo : resInfoList) {
String packageName = resolveInfo.activityInfo.packageName;
context.grantUriPermission(packageName, uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
}
return shareIntent;
}
}