De Android: Attaching files from internal cache to Gmail (con algunas modificaciones que le permite ejecutar este código en Lollipop).
Básicamente lo que necesita para implementar su propia clase que se extiende ContentProvider (digamos CachedFileProvider, véase más adelante), y añadir un campo siguiente en el manifiesto (en el interior de la etiqueta/aplicación):
<provider
android:name=".CachedFileProvider"
android:authorities="com.your.app.provider"
android:grantUriPermissions="true" />
Al abrir un selector electrónico, utilizar código siguiente:
File f = getLocalFileToSend();
Uri uri = Uri.parse("content://" + CachedFileProvider.AUTHORITY + "/" + f.getName());
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_SUBJECT, "Subject");
intent.putExtra(Intent.EXTRA_TEXT, "Body");
intent.putExtra(Intent.EXTRA_STREAM, uri);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // Grant permissions to read.
startActivity(Intent.createChooser(intent, "Send Email"));
El código para CachedFileProvider:
package ...;
import java.io.File;
import java.io.FileNotFoundException;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.net.Uri;
import android.os.ParcelFileDescriptor;
import android.util.Log;
public class CachedFileProvider extends ContentProvider {
private static final String TAG = "CachedFileProvider";
private static final String CLASS_NAME = "CachedFileProvider";
// The authority is the symbolic name for the provider class.
// Should match one in the manifest file.
public static final String AUTHORITY = "com.your.app.provider";
// UriMatcher used to match against incoming requests
private UriMatcher uriMatcher;
@Override
public boolean onCreate() {
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
// Add a URI to the matcher which will match against the form
// 'content://com.stephendnicholas.gmailattach.provider/*'
// and return 1 in the case that the incoming Uri matches this pattern
uriMatcher.addURI(AUTHORITY, "*", 1);
return true;
}
@Override
public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
Log.v(TAG, "Called with uri: '" + uri + "'." + uri.getLastPathSegment());
// Check incoming Uri against the matcher
switch (uriMatcher.match(uri)) {
// If it returns 1 - then it matches the Uri defined in onCreate
case 1:
// The desired file name is specified by the last segment of the path.
String fileLocation = getContext().getCacheDir() + File.separator
+ uri.getLastPathSegment();
// Create & return a ParcelFileDescriptor pointing to the file
// Note: I don't care what mode they ask for - they're only getting
// read only
ParcelFileDescriptor pfd = ParcelFileDescriptor.open(new File(
fileLocation), ParcelFileDescriptor.MODE_READ_ONLY);
return pfd;
// Otherwise unrecognised Uri
default:
Log.v(TAG, "Unsupported uri: '" + uri + "'.");
throw new FileNotFoundException("Unsupported uri: "
+ uri.toString());
}
}
// //////////////////////////////////////////////////////////////
// Not supported/used/required for this example
// //////////////////////////////////////////////////////////////
@Override
public int update(Uri uri, ContentValues contentvalues, String s,
String[] as) {
return 0;
}
@Override
public int delete(Uri uri, String s, String[] as) {
return 0;
}
@Override
public Uri insert(Uri uri, ContentValues contentvalues) {
return null;
}
@Override
public String getType(Uri uri) {
return null;
}
@Override
public Cursor query(Uri uri, String[] projection, String s, String[] as1,
String s1) {
return null;
}
}
Usted no obtener algún error? Simplemente envía, usted recibe el correo electrónico, ¿pero ningún archivo adjunto? –
No recibo ningún error. Simplemente envía sin ningún archivo adjunto. – brig