¿Cómo abrir archivos privados guardados en el almacenamiento interno usando Intent.ACTION_VIEW?

Estoy intentando un progtwig de ejemplo para almacenar un archivo en el almacenamiento interno y abrirlo usando Intent.ACTION_VIEW.

Para almacenar el archivo en modo privado, seguí los pasos proporcionados aquí.

Pude encontrar el archivo creado en el almacenamiento interno en /data/data/com.storeInternal.poc/files. *

Pero cuando intenté abrir el archivo, no se abre.

A continuación, encontrará el código que utilicé para ello.

public class InternalStoragePOCActivity extends Activity { /** Called when the activity is first created. */ String FILENAME = "hello_file.txt"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); createFile(); openFile(FILENAME); } public FileOutputStream getStream(String path) throws FileNotFoundException { return openFileOutput(path, Context.MODE_PRIVATE); } public void createFile(){ String string = "hello world!"; FileOutputStream fout = null; try { //getting output stream fout = getStream(FILENAME); //writng data fout.write(string.getBytes()); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally{ if(fout!=null){ //closing the output stream try { fout.close(); } catch (IOException e) { e.printStackTrace(); } } } } public void openFile(String filePath) { try { File temp_file = new File(filePath); Uri data = Uri.fromFile(temp_file); String type = getMimeType(data.toString()); Intent intent = new Intent(android.content.Intent.ACTION_VIEW); intent.setDataAndType(data, type); startActivity(intent); } catch (Exception e) { Log.d("Internal Storage POC ", "No Supported Application found to open this file"); e.printStackTrace(); } } public static String getMimeType(String url) { String type = null; String extension = MimeTypeMap.getFileExtensionFromUrl(url); if (extension != null) { MimeTypeMap mime = MimeTypeMap.getSingleton(); type = mime.getMimeTypeFromExtension(extension); } return type; } } 

¿Cómo puedo abrir el archivo almacenado usando Context.MODE_PRIVATE con cualquier otra aplicación existente / apropiada? Por ejemplo: file.pdf debe abrirse con un lector de PDF, video por reproductores de video, etc.

No puede compartir / enviar un archivo en el almacenamiento interno, como se hace referencia en un URI, a través de una intención de otra aplicación. Una aplicación no puede leer los datos privados de otra aplicación (a menos que sea a través de un proveedor de contenido). Usted pasa el URI del archivo con la intención (no el archivo real en sí) y la aplicación que recibe el bash debe poder leer desde ese URI.

La solución más simple es copiar primero el archivo al almacenamiento externo y compartirlo desde allí. Si no quiere hacer eso, cree un proveedor de contenido para exponer su archivo. Puede encontrar un ejemplo aquí: Crear y compartir un archivo desde el almacenamiento interno

EDITAR: Para usar un proveedor de contenido:

Primero crea tu clase de proveedor de contenido de la siguiente manera. La anulación importante aquí es ‘openFile’. Cuando se llama a su proveedor de contenido con un URI de archivo, este método se ejecutará y devolverá un ParcelFileDescriptor para él. Los otros métodos deben estar presentes ya que son abstractos en ContentProvider.

 public class MyProvider extends ContentProvider { @Override public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException { File privateFile = new File(getContext().getFilesDir(), uri.getPath()); return ParcelFileDescriptor.open(privateFile, ParcelFileDescriptor.MODE_READ_ONLY); } @Override public int delete(Uri arg0, String arg1, String[] arg2) { return 0; } @Override public String getType(Uri arg0) { return null; } @Override public Uri insert(Uri arg0, ContentValues arg1) { return null; } @Override public boolean onCreate() { return false; } @Override public Cursor query(Uri arg0, String[] arg1, String arg2, String[] arg3, String arg4) { return null; } @Override public int update(Uri arg0, ContentValues arg1, String arg2, String[] arg3) { return 0; } } 

Defina su proveedor en el Manifiesto dentro de la etiqueta de la aplicación, con exported = true para permitir que otras aplicaciones lo utilicen:

  

En el método openFile () que tienes en tu Actividad, configura un URI como a continuación. Este URI apunta al proveedor de contenido en su paquete junto con el nombre del archivo:

 Uri uri = Uri.parse("content://your.package.name/" + filePath); 

Finalmente, configure este uri con la intención:

 intent.setDataAndType(uri, type); 

Recuerde insertar su propio nombre de paquete donde he usado ‘your.package.name’ arriba.

  File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "Foder path" + "/" + "File Name"); Uri uri = Uri.fromFile(file); Intent in = new Intent(Intent.ACTION_VIEW); in.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); in.setDataAndType(uri, "mime type"); startActivity(in); 

[Nota: Seleccione el tipo de mime según su tipo de archivo]

Si alguien todavía enfrenta un problema como: no se pudo acceder al archivo. Esto podría ayudarte. Junto con el proveedor de contenido, debes configurar el siguiente indicador también …

 intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 

o

 intent.setFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION); 

Necesito reputación por favor: D