Cómo compartir archivos de almacenamiento interno con Gmail Client

Estoy tratando de compartir mi archivo de almacenamiento interno a través del cliente de Gmail en mi Moto Razr, pero cada vez que envié a mi cuenta de prueba de Gmail, tengo todo, excepto el archivo adjunto.

Esto es cómo invoco y comienzo gmail, mientras que agrego el archivo como accesorio.

private void saveDaily() { Intent intent = new Intent(android.content.Intent.ACTION_SEND_MULTIPLE); intent.setType("text/plain"); intent.putExtra(Intent.EXTRA_EMAIL, new String[] { loadEmailAddress() }); intent.putExtra(Intent.EXTRA_SUBJECT, "Daily"); intent.putExtra(Intent.EXTRA_TEXT, "Daily Log"); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); ArrayList<Uri> uris = new ArrayList<Uri>(); uris.add(saveDaily2File("dailyRecord.txt")); Log.d(TAG_D, "Size: " + uris.size()); intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris); startActivity(Intent.createChooser(intent, "Send email")); } 

Así es como implemento mi proveedor de contenido personalizado.

 public class SavedFileProvider extends ContentProvider { private static final String TAG_D = "ContentProvider"; private static final HashMap<String, String> MIME_TYPES = new HashMap<String, String>(); static { MIME_TYPES.put(".txt", "text/plain"); } @Override public String getType(Uri uri) { String path = uri.toString(); for (String extension : MIME_TYPES.keySet()) { if (path.endsWith(extension)) { return (MIME_TYPES.get(extension)); } } return (null); } @Override public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException { Log.d(TAG_D, "openFile()"); File f = new File(getContext().getFilesDir(), uri.getPath()); Log.d(TAG_D, f.getAbsolutePath()); if (f.exists()) { return (ParcelFileDescriptor.open(f, ParcelFileDescriptor.MODE_READ_ONLY)); } throw new FileNotFoundException(uri.getPath()); } @Override public Cursor query(Uri url, String[] projection, String selection, String[] selectionArgs, String sort) { throw new RuntimeException("Operation not supported"); } @Override public Uri insert(Uri uri, ContentValues initialValues) { throw new RuntimeException("Operation not supported"); } @Override public int update(Uri uri, ContentValues values, String where, String[] whereArgs) { throw new RuntimeException("Operation not supported"); } @Override public int delete(Uri uri, String where, String[] whereArgs) { throw new RuntimeException("Operation not supported"); } private void copy(InputStream in, File dst) throws IOException { FileOutputStream out = new FileOutputStream(dst); byte[] buf = new byte[1024]; int len; while ((len = in.read(buf)) > 0) { out.write(buf, 0, len); } in.close(); out.close(); } @Override public boolean onCreate() { Log.d(TAG_D, "onCreate()"); File f = new File(getContext().getFilesDir(), "dailyRecord.txt"); if (!f.exists()) { AssetManager assets = getContext().getResources().getAssets(); try { copy(assets.open("dailyRecord.txt"), f); } catch (IOException e) { Log.e("FileProvider", "Exception copying from assets", e); return (false); } } return (true); } 

}

A continuación, agrego las siguientes líneas en mi archivo AndroidManifest.xml.

 <provider android:name=".SavedFileProvider" android:authorities="Package Path here" android:exported="true" android:grantUriPermissions="true" android:multiprocess="true" > </provider> 

Me pregunto qué me falta aquí.

He revisado el enlace: Link1 , Link2

Yo uso esto:

AndroidManifest.xml

 <provider android:name="com.myapp.main.MyContentProvider" android:authorities="com.myapp.main"></provider> 

Botón de clic:

  public void onClick(View v) { List<Intent> targetedShareIntents = new ArrayList<Intent>(); Intent shareIntent = new Intent(Intent.ACTION_SEND); shareIntent.setType("image/jpg"); Uri theUri = Uri.parse("content://com.myapp.main/"+srcImage); List<ResolveInfo> resInfo = getPackageManager().queryIntentActivities(shareIntent, 0); int i=0; List<ResolveInfo> reInfoToDelete = new ArrayList<ResolveInfo>(); if (!resInfo.isEmpty()){ for (ResolveInfo resolveInfo : resInfo) { String packageName = resolveInfo.activityInfo.packageName; Intent targetedShareIntent = new Intent(android.content.Intent.ACTION_SEND); targetedShareIntent.setType("image/jpg"); targetedShareIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Share file"); if (packageName.equals("com.google.android.gm")){ targetedShareIntent.setType("image/png"); targetedShareIntent.putExtra(Intent.EXTRA_TEXT, "some text"); targetedShareIntent.putExtra(Intent.EXTRA_STREAM, theUri); targetedShareIntent.setPackage(packageName); targetedShareIntents.add(targetedShareIntent); } } startActivity(targetedShareIntents.remove(0)); } } 

Mi clase de proveedor de contenido

  public class MyContentProvider extends ContentProvider implements PipeDataWriter<InputStream>{ @Override public AssetFileDescriptor openAssetFile(Uri uri, String mode) throws FileNotFoundException { //Adapt this to your code AssetManager am = getContext().getAssets(); String file_name = "path/"+uri.getLastPathSegment(); if(file_name == null) throw new FileNotFoundException(); AssetFileDescriptor afd = null; try { afd = am.openFd(file_name); } catch (IOException e) { e.printStackTrace(); } return afd;//super.openAssetFile(uri, mode); } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { // TODO Auto-generated method stub return 0; } @Override public String getType(Uri uri) { // TODO Auto-generated method stub return null; } @Override public Uri insert(Uri uri, ContentValues values) { // TODO Auto-generated method stub return null; } @Override public boolean onCreate() { // TODO Auto-generated method stub return false; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { // TODO Auto-generated method stub return null; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { // TODO Auto-generated method stub return 0; } public void writeDataToPipe(ParcelFileDescriptor arg0, Uri arg1, String arg2, Bundle arg3, InputStream arg4) { // Transfer data from the asset to the pipe the client is reading. byte[] buffer = new byte[8192]; int n; FileOutputStream fout = new FileOutputStream(arg0.getFileDescriptor()); try { while ((n=arg4.read(buffer)) >= 0) { fout.write(buffer, 0, n); } } catch (IOException e) { Log.i("InstallApk", "Failed transferring", e); } finally { try { arg4.close(); } catch (IOException e) { } try { fout.close(); } catch (IOException e) { } } } } 
  • Android EditText Gmail tiene gusto de campo
  • Android que envía correo electrónico con archivos adjuntos no siempre funciona
  • Error: No se puede adjuntar archivo vacío en la aplicación GMAIL usando el proveedor de archivos
  • aplicación de gmail para Android como las conversaciones
  • ¿Existe un método para desactivar la función Auto-resize de la aplicación de Gmail en el diseño de un correo electrónico?
  • Gmail Sync en el teléfono Android
  • Cómo iniciar sesión en mi aplicación a través de las credenciales de google en android
  • Utilice SyncAdapter para sincronizar con * local * datos de aplicaciones de Gmail y Facebook
  • GMail para KitKat se bloquea al enviar archivos adjuntos que no son imágenes o videos
  • Enviar Gmail mediante programación mediante Auth Cookie
  • getAuthToken no llama a AccountManagerCallback
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.