pie - Excepción ''abrir error: EACCES(Permiso denegado)'' en Android
android pie (24)
estoy obteniendo
EACCES (Permission denied)
apertura:EACCES (Permission denied)
en la línea OutputStream myOutput = new FileOutputStream(outFileName);
Revisé la raíz y probé android.permission.WRITE_EXTERNAL_STORAGE
.
¿Como puedo solucionar este problema?
try {
InputStream myInput;
myInput = getAssets().open("XXX.db");
// Path to the just created empty db
String outFileName = "/data/data/XX/databases/"
+ "XXX.db";
// Open the empty db as the output stream
OutputStream myOutput = new FileOutputStream(outFileName);
// Transfer bytes from the inputfile to the outputfile
byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer)) > 0) {
myOutput.write(buffer, 0, length);
}
// Close the streams
myOutput.flush();
myOutput.close();
myInput.close();
buffer = null;
outFileName = null;
}
catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
Añadir dependencias de gradle
implementation ''com.karumi:dexter:4.2.0''
Agregue el siguiente código en su actividad principal.
import com.karumi.dexter.Dexter;
import com.karumi.dexter.MultiplePermissionsReport;
import com.karumi.dexter.PermissionToken;
import com.karumi.dexter.listener.PermissionRequest;
import com.karumi.dexter.listener.multi.MultiplePermissionsListener;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
checkMermission();
}
}, 4000);
}
private void checkMermission(){
Dexter.withActivity(this)
.withPermissions(
android.Manifest.permission.READ_EXTERNAL_STORAGE,
android.Manifest.permission.WRITE_EXTERNAL_STORAGE,
android.Manifest.permission.ACCESS_NETWORK_STATE,
Manifest.permission.INTERNET
).withListener(new MultiplePermissionsListener() {
@Override
public void onPermissionsChecked(MultiplePermissionsReport report) {
if (report.isAnyPermissionPermanentlyDenied()){
checkMermission();
} else if (report.areAllPermissionsGranted()){
// copy some things
} else {
checkMermission();
}
}
@Override
public void onPermissionRationaleShouldBeShown(List<PermissionRequest> permissions, PermissionToken token) {
token.continuePermissionRequest();
}
}).check();
}
Añadir permiso en manifiesto.
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_INTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
Además de todas las respuestas, asegúrese de no usar su teléfono como dispositivo de almacenamiento USB.
Estaba teniendo el mismo problema en HTC Sensation en modo de almacenamiento USB habilitado. Todavía puedo depurar / ejecutar la aplicación, pero no puedo guardar en el almacenamiento externo.
Además de todas las respuestas, si los clientes usan Android 6.0, Android agregó un nuevo modelo de permiso para (Marshmallow).
Truco: si está apuntando a la versión 22 o inferior, su aplicación solicitará todos los permisos en el momento de la instalación tal como lo haría en cualquier dispositivo que ejecute un sistema operativo por debajo de Marshmallow. Si está probando el emulador, a partir de android 6.0 en adelante deberá ir explícitamente a la configuración-> aplicaciones-> YOURAPP -> permisos y cambiar el permiso si ha otorgado alguno.
Cambie una propiedad de permiso en su /system/etc/permission/platform.xml
Y el grupo necesita mencionarse como a continuación.
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE">
<group android:gid="sdcard_rw" />
<group android:gid="media_rw" />
</uses-permission>
Construyendo sobre la respuesta por usuario462990
Para recibir una notificación cuando el usuario responda al cuadro de diálogo de solicitud de permiso, use esto: (código en kotlin)
override fun onRequestPermissionsResult(requestCode: Int,
permissions: Array<String>, grantResults: IntArray) {
when (requestCode) {
MY_PERMISSIONS_REQUEST_READ_CONTACTS -> {
// If request is cancelled, the result arrays are empty.
if ((grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED)) {
// permission was granted, yay! Do the
// contacts-related task you need to do.
} else {
// permission denied, boo! Disable the
// functionality that depends on this permission.
}
return
}
// Add other ''when'' lines to check for other
// permissions this app might request.
else -> {
// Ignore all other requests.
}
}
}
Cuando su aplicación pertenece a la aplicación del sistema, no puede acceder a la tarjeta SD.
Después de agregar permiso resolví mi problema
<uses-permission android:name="android.permission.INTERNET"/>
En mi caso, estaba usando una biblioteca de selección de archivos que devolvía la ruta al almacenamiento externo, pero comenzó desde /root/
. E incluso con el permiso WRITE_EXTERNAL_STORAGE otorgado en tiempo de ejecución, todavía tengo el error EACCES (Permiso denegado) .
Entonces use Environment.getExternalStorageDirectory()
para obtener la ruta correcta al almacenamiento externo.
Ejemplo:
No se puede escribir: /root/storage/emulated/0/newfile.txt
Puede escribir: /storage/emulated/0/newfile.txt
boolean externalStorageWritable = isExternalStorageWritable();
File file = new File(filePath);
boolean canWrite = file.canWrite();
boolean isFile = file.isFile();
long usableSpace = file.getUsableSpace();
Log.d(TAG, "externalStorageWritable: " + externalStorageWritable);
Log.d(TAG, "filePath: " + filePath);
Log.d(TAG, "canWrite: " + canWrite);
Log.d(TAG, "isFile: " + isFile);
Log.d(TAG, "usableSpace: " + usableSpace);
/* Checks if external storage is available for read and write */
public boolean isExternalStorageWritable() {
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
return true;
}
return false;
}
Salida 1:
externalStorageWritable: true
filePath: /root/storage/emulated/0/newfile.txt
isFile: false
usableSpace: 0
Salida 2:
externalStorageWritable: true
filePath: /storage/emulated/0/newfile.txt
isFile: true
usableSpace: 1331007488
Espero que todo lo que se encuentre debajo /data
pertenezca al "almacenamiento interno". Sin embargo, deberías poder escribir en /sdcard
.
Estoy creando una carpeta en / data / en mi init.rc (revolviendo con el aosp en Nexus 7) y tuve exactamente este problema.
Resultó que dar permiso a la carpeta rw (666) no era suficiente y tenía que ser rwx (777), ¡entonces todo funcionó!
Estoy experimentando lo mismo. Lo que encontré es que si va a Configuración -> Administrador de aplicaciones -> Su aplicación -> Permisos -> Habilitar almacenamiento , se soluciona el problema.
Extrañamente después de poner una barra diagonal "/" antes de que se resolviera mi nuevo archivo, mi problema se resolvió Cambié esto:
File myFile= new File(Environment.getExternalStorageDirectory() + "newFile");
a esto:
File myFile= new File(Environment.getExternalStorageDirectory() + "/newFile");
He observado esto una vez al ejecutar la aplicación dentro del emulador. En la configuración del emulador, debe especificar el tamaño del almacenamiento externo ("Tarjeta SD") correctamente. De forma predeterminada, el campo de "almacenamiento externo" está vacío, y eso probablemente significa que no hay tal dispositivo y EACCES se lanza incluso si se conceden permisos en el manifiesto.
La aplicación posterior a 6.0 de los permisos de almacenamiento puede omitirse si tiene un dispositivo rooteado a través de estos comandos adb:
root@msm8996:/ # getenforce
getenforce
Enforcing
root@msm8996:/ # setenforce 0
setenforce 0
root@msm8996:/ # getenforce
getenforce
Permissive
Mi problema fue con "TargetApi (23)", que es necesario si su minSdkVersion está por debajo de 23.
Por lo tanto, tengo permiso de solicitud con el siguiente fragmento de código
protected boolean shouldAskPermissions() {
return (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1);
}
@TargetApi(23)
protected void askPermissions() {
String[] permissions = {
"android.permission.READ_EXTERNAL_STORAGE",
"android.permission.WRITE_EXTERNAL_STORAGE"
};
int requestCode = 200;
requestPermissions(permissions, requestCode);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// ...
if (shouldAskPermissions()) {
askPermissions();
}
}
Para API 23+ necesita solicitar los permisos de lectura / escritura incluso si ya están en su manifiesto.
// Storage Permissions
private static final int REQUEST_EXTERNAL_STORAGE = 1;
private static String[] PERMISSIONS_STORAGE = {
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
};
/**
* Checks if the app has permission to write to device storage
*
* If the app does not has permission then the user will be prompted to grant permissions
*
* @param activity
*/
public static void verifyStoragePermissions(Activity activity) {
// Check if we have write permission
int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (permission != PackageManager.PERMISSION_GRANTED) {
// We don''t have permission so prompt the user
ActivityCompat.requestPermissions(
activity,
PERMISSIONS_STORAGE,
REQUEST_EXTERNAL_STORAGE
);
}
}
AndroidManifest.xml
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Para obtener documentación oficial sobre la solicitud de permisos para API 23+, consulte https://developer.android.com/training/permissions/requesting.html
Resultó que fue un error estúpido ya que mi teléfono todavía estaba conectado a la computadora de escritorio y no me había dado cuenta.
Así que tuve que apagar la conexión USB y todo funcionó bien.
Tal vez la respuesta es la siguiente:
en la API> = 23 dispositivos, si instala la aplicación (la aplicación no es la aplicación del sistema), debe verificar el permiso de almacenamiento en "Configuración - aplicaciones", ¡hay una lista de permisos para cada aplicación, debe verificarlo! tratar
Tuve el mismo error cuando intentaba escribir una imagen en la carpeta DCIM / camera en Galaxy S5 (Android 6.0.1) y descubrí que solo esta carpeta está restringida. Simplemente podría escribir en DCIM / cualquier carpeta pero no en la cámara. Esto debería ser una restricción / personalización basada en la marca.
Tuve el mismo problema (API> = 23).
La solución https://.com/a/13569364/1729501 funcionó para mí, pero no fue práctico desconectar la aplicación para la depuración.
Mi solución fue instalar el controlador de dispositivo adb adecuado en Windows. El controlador USB de Google no funcionó para mi dispositivo.
PASO 1: descargue los controladores adb para la marca de su dispositivo.
PASO 2: Vaya al administrador de dispositivos -> otros dispositivos -> busque entradas con la palabra "adb" -> seleccione Actualizar controlador -> indique la ubicación en el paso 1
Tuve el mismo problema ... El <uses-permission
estaba en el lugar equivocado. Esto es correcto:
<manifest>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
...
<application>
...
<activity>
...
</activity>
</application>
</manifest>
La etiqueta uses-permission
debe estar fuera de la etiqueta de la application
.
Tuve el mismo problema en Samsung Galaxy Note 3, ejecutando CM 12.1. El problema para mi era que yo tenía
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="18"/>
Y tuvo que usarlo para tomar y almacenar fotos de usuarios. Cuando intenté cargar esas mismas fotos en ImageLoader, recibí el error (Permission denied)
. La solución fue agregar explícitamente
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
ya que el permiso anterior solo limita el permiso de escritura hasta la versión 18 de la API, y con ello el permiso de lectura.
Tuve el mismo problema y ninguna de las sugerencias me ayudó. Pero encontré una razón interesante para eso, en un dispositivo físico, Galaxy Tab .
Cuando el almacenamiento USB está activado, los permisos de lectura y escritura del almacenamiento externo no tienen ningún efecto. Simplemente apague el almacenamiento USB, y con los permisos correctos, tendrá el problema resuelto.