También puede verificar que fopen() funciona correctamente, pero no si estás tratando de acceder a un archivo en la carpeta de recursos o activos de la aplicación. Recomiendo, para evitar tener que reinventar la rueda, que coloque los activos que desea enviar con su aplicación en la carpeta de activos, donde se empaquetarán para su distribución.
En el caso de carpeta de activos, debe hacer una de estas dos cosas, dependiendo de si el archivo fue comprimido por el empaquetador. Ambos usan los métodos de AssetManager, y usted puede obtener AssetManager del contexto/aplicación. Los nombres de archivo siempre son relativos a la carpeta de activos, por cierto: si tiene un archivo "foo.png" directamente en la carpeta de activos, abriría "foo.png" no algo así como "assets/foo.png" .
Si el archivo no se ha comprimido (es decir, es una de las extensiones que no se comprimen, como .png), se puede obtener un descriptor de archivo de AssetManager.openFd() y pasarlo a C++. Entonces puedes usar fdopen (dup (fd), "r"); para abrir el archivo como un ARCHIVO *. Tenga en cuenta que debe fseek() para el desplazamiento, y realizar un seguimiento de la longitud del archivo usted mismo. Realmente está obteniendo un identificador de archivo para todo el paquete de activos, y su archivo de interés es solo una pequeña parte.
Si su archivo está comprimido, necesita usar el lector de flujo de Java: AssetManager.open() le proporciona un InputStream en el que puede leer el archivo. Esto es un PITA porque no puede consultar (AFAIK) el tamaño del archivo; Ejecuto un paso de preproceso en mi carpeta de activos que genera una lista de todos los archivos con sus respectivos tamaños para que pueda saber, por ejemplo, qué tan grande de un búfer para asignar.
Si el archivo es un recurso, es posible que tenga que pasar por la clase de recursos para acceder a ella, aunque parece que los recursos también se empaquetan en el mismo paquete de activos. El recurso tiene una llamada a openRawResource() para obtener el InputStream y una llamada a openRawResourceFd() para obtener el descriptor del archivo, como el anterior.
Buena suerte.
Lo sentimos, olvidamos actualizar esto. La raíz del problema no era obtener permisos para leer/escribir. Un problema similar también puede ser causado por tener la tarjeta SD montada y luego intentar abrir un archivo en ella. – RyanCheu
tengo el mismo problema con usted, ¿lo ha solucionado? –