Mi objetivo es crear un archivo XML en de almacenamiento interno y luego enviarlo a través del recurso compartido Compartir.Crear y compartir un archivo desde el almacenamiento interno
soy capaz de crear un archivo XML que utiliza este código
FileOutputStream outputStream = context.openFileOutput(fileName, Context.MODE_WORLD_READABLE);
PrintStream printStream = new PrintStream(outputStream);
String xml = this.writeXml(); // get XML here
printStream.println(xml);
printStream.close();
estoy atascado tratando de recuperar un Uri al archivo de salida con el fin de compartirlo. Probé por primera vez para acceder al archivo al convertir el archivo a un Uri
File outFile = context.getFileStreamPath(fileName);
return Uri.fromFile(outFile);
Esto devuelve archivo: ///data/data/com.my.package/files/myfile.xml pero no puedo parecen adjuntar esto a un correo electrónico, cargar, etc.
Si verifico manualmente la longitud del archivo, es correcto y muestra que hay un tamaño de archivo razonable.
A continuación, creé un proveedor de contenido e intenté hacer referencia al archivo y no es un identificador válido para el archivo. El ContentProvider
nunca parece llamarse un punto.
Uri uri = Uri.parse("content://" + CachedFileProvider.AUTHORITY + "/" + fileName);
return uri;
Esto devuelve contenido: //com.my.package.provider/myfile.xml pero puedo comprobar el archivo y es de longitud cero.
¿Cómo accedo a los archivos correctamente? ¿Necesito crear el archivo con el proveedor de contenido? ¿Si es así, cómo?
actualización
Aquí está el código que estoy usando para compartir. Si selecciono Gmail, se muestra como un archivo adjunto, pero cuando lo envío arroja un error No se pudo mostrar el archivo adjunto y el correo electrónico que llega no tiene datos adjuntos.
public void onClick(View view) {
Log.d(TAG, "onClick " + view.getId());
switch (view.getId()) {
case R.id.share_cancel:
setResult(RESULT_CANCELED, getIntent());
finish();
break;
case R.id.share_share:
MyXml xml = new MyXml();
Uri uri;
try {
uri = xml.writeXmlToFile(getApplicationContext(), "myfile.xml");
//uri is "file:///data/data/com.my.package/files/myfile.xml"
Log.d(TAG, "Share URI: " + uri.toString() + " path: " + uri.getPath());
File f = new File(uri.getPath());
Log.d(TAG, "File length: " + f.length());
// shows a valid file size
Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.putExtra(Intent.EXTRA_STREAM, uri);
shareIntent.setType("text/plain");
startActivity(Intent.createChooser(shareIntent, "Share"));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
break;
}
}
me di cuenta de que hay una Exception
tirado aquí desde el interior createChooser (...), pero no puedo entender por qué se ha tirado.
E/ActivityThread (572): Actividad com.android.internal.app.ChooserActivity ha filtrado IntentReceiver [email protected] que fue registrado inicialmente aquí. ¿Te estás perdiendo una llamada al unregisterReceiver()?
He investigado este error y no encuentro nada obvio. Ambos enlaces sugieren que necesito anular el registro de un receptor.
- ChooserActivity has leaked IntentReceiver
- Why does Intent.createChooser() need a BroadcastReceiver and how to implement?
que tienen una configuración del receptor, pero es para un AlarmManager
que se establece en otro lugar y no requiere la aplicación para registrar/anular el registro.
Código para openFile (...)
En caso de que sea necesario, aquí está el proveedor de contenido que he creado.
public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
String fileLocation = getContext().getCacheDir() + "/" + uri.getLastPathSegment();
ParcelFileDescriptor pfd = ParcelFileDescriptor.open(new File(fileLocation), ParcelFileDescriptor.MODE_READ_ONLY);
return pfd;
}
Creo que el primer método debería funcionar, en lugar de crear un contentProvider. ContentProvider se utiliza para devolver datos en lugar de un archivo completo, no servirá a sus necesidades. Supongo que no hay aplicaciones para manejar tu xml. ¿Puede publicar el código donde se está creando el intento de compartir – nandeesh
Se agregó más código en caso de que sea más obvio, así como una excepción que no entiendo si está relacionada o no. – Kirk
¿Has creado un ContentProvider? Si tiene, puede publicar su código para ello. Si no lo has hecho, necesitas crear un ContentProvider y anular el método openFile. Ese método lo llamará gmail cuando intente abrir el archivo asociado con el contenido: //com.my.package.provider/myfile.xml uri. – Rob