Thursday, April 20, 2017

Error: Cannot attach empty file in GMAIL app using File provider

Leave a Comment

I am trying to attach a pdf file in gmail app. I have read this and this (applied solution) I am trying as;

public static void attachFile(Context ctx) {     String TAG = "Attach";     File documentsPath = new File(ctx.getFilesDir(), "documents");     Log.i(TAG,"documentsAbsolutePath Output");     Log.i(TAG, documentsPath.getAbsolutePath().toString());     File file = new File(documentsPath, "sample.pdf");     if ( file.exists() ) {         Toast.makeText(ctx, "Exits", Toast.LENGTH_LONG).show();     }else{         Toast.makeText(ctx, "Not Exist", Toast.LENGTH_LONG).show();     }     Log.i(TAG,"file Output");     Log.i(TAG, file.toString());     Log.i(TAG, String.valueOf(file.length()));     Uri uri = FileProvider.getUriForFile(ctx, "com.example.fyp_awais.attachfiletest2.fileprovider", file);     Log.i(TAG,"URI Output");     Log.i(TAG,uri.toString());     Intent intent = ShareCompat.IntentBuilder.from((Activity) ctx)             .setType("application/pdf")             .setStream(uri)             .setChooserTitle("Choose bar")             .createChooserIntent()             .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);     ctx.startActivity(intent); } 

Outputs

documentsAbsolutePath Output /data/data/com.example.fyp_awais.attachfiletest2/files/documents  file Output /data/data/com.example.fyp_awais.attachfiletest2/files/documents/sample.pdf  0  URI Output  content://com.example.fyp_awais.attachfiletest2.fileprovider/pdf_folder/sample.pdf 

Menifest

<provider     android:name="android.support.v4.content.FileProvider"     android:authorities="com.example.fyp_awais.attachfiletest2.fileprovider"     android:exported="false"     android:grantUriPermissions="true">     <meta-data         android:name="android.support.FILE_PROVIDER_PATHS"         android:resource="@xml/filepath" /> </provider> 

FilePath.xml

<?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">     <paths xmlns:android="http://schemas.android.com/apk/res/android">         <files-path name="pdf_folder" path="documents/"/>     </paths> </PreferenceScreen 

A pdf file is saved in Galaxy Core Prime\Phone\documents. (file size: 53.7KB)

But it gives

Cannot attach empty file.

enter image description here

I am confused with folder-name in this line <files-path name="pdf_folder" path="documents/"/>. The file is in the \Phone\documents. Then why folder name?

Edit 1

Tried to replace setType(application/pdf) with setType("message/rfc822") But did not work. Any help?

6 Answers

Answers 1

Send the file in URI format like this:

Intent emailIntent = new Intent(Intent.ACTION_SEND_MULTIPLE);         emailIntent.setData(Uri.parse("mailto:"));         emailIntent.setType("application/image");         emailIntent.putExtra(Intent.EXTRA_EMAIL, TO);         emailIntent.putExtra(Intent.EXTRA_CC, CC); ArrayList<Uri> uris = new ArrayList<>();         //convert from paths to Android friendly Parcelable Uri's         uris.add(frontImageUri);         uris.add(backImageUri);         emailIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris); startActivity(Intent.createChooser(emailIntent, "Send mail...")); 

Answers 2

if it's ok To send Zip then try this way

String fileNameStor_zip = Environment.getExternalStorageDirectory() + "/" + fileName + ".zip";

String[] path = { your 1st pdf File Path, your 2nd pdf File Path};

Compress compress = new Compress(path, fileNameStor_zip);

compress.zip();

URI = Uri.parse("file://" + fileNameStor_zip);

Provide your Gmail Intent

intent.putExtra(Intent.EXTRA_STREAM, URI);

Answers 3

Uri contentUri = FileProvider.getUriForFile(this, "com.mydomain.fileprovider", newFile); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); i.setData(contentUri); 

Answers 4

String filename="my_file.vcf";  File filelocation = new File(Environment.getExternalStorageDirectory().getAbsolutePath(), filename); Uri path = Uri.fromFile(filelocation);  Intent emailIntent = new Intent(Intent.ACTION_SEND); // set the type to 'email' emailIntent .setType("vnd.android.cursor.dir/email"); String to[] = {"asd@gmail.com"}; emailIntent .putExtra(Intent.EXTRA_EMAIL, to); // the attachment emailIntent .putExtra(Intent.EXTRA_STREAM, path); // the mail subject emailIntent .putExtra(Intent.EXTRA_SUBJECT, "Subject"); startActivity(Intent.createChooser(emailIntent , "Send email...")); 

Answers 5

You have to grant the permission to access storage for gmail.

Answers 6

In case it helps- here's what I do in an app debug function with a few files, it shouldn't really be any different. I do copy/export them into a user-public folder first before attaching them, and make them world readable.

 if (verifyStoragePermissions(c)) {         final Intent intent = new Intent(Intent.ACTION_SEND_MULTIPLE);         intent.setType("text/plain");         intent.putExtra(Intent.EXTRA_EMAIL, new String[]{"recipient@email.address"});         intent.putExtra(Intent.EXTRA_SUBJECT, "Email Subject");          //build up message         ArrayList<Uri> uris = new ArrayList<>();         StringBuilder content = new StringBuilder();         content.append(                 String.format(                         c.getString(R.string.message_log_upload_email_body) +                                 "\n\nmodelDesc:%s \n\nmanuf:%s \n\naId: %s,\n\nhIid: %s,\n\nfbId: %s.",                         Build.MODEL, Build.MANUFACTURER, getSomeVar1(), getSomeVar2(), getSomeVar3())         );         content.append("\n\nMy logged in account id is: ").append(getAccountId(c)).append(".");         content.append("\n\nHere's an overview of my attachments:\n");          for (String s : addresses) {             File f = new File(s);             //noinspection ResultOfMethodCallIgnored             f.setReadable(true, false);             Uri add = Uri.fromFile(f);             //add attachment manifest             content.append(String.format(Locale.UK, "|->  %s (%.3f kb)\n", f.getName(), (float) f.length() / 1024));             uris.add(add);         }         //attach the things         intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris);         //set content/message         intent.putExtra(Intent.EXTRA_TEXT, content.toString());         c.startActivity(intent);     } } 

addresses is a String[] param to that function. I build it up by making the functions I use to export the files return arrays of strings of the addresses of the files they've exported - as I initially store the files in my app's private storage

If You Enjoyed This, Take 5 Seconds To Share It

0 comments:

Post a Comment