java - solicitar - ActivityCompat.requestPermissions no muestra el cuadro de diálogo
requestpermissions multiple (18)
if (ContextCompat.checkSelfPermission(RegisterActivity.this, Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_DENIED){
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.READ_PHONE_STATE}, REQUEST_READ_PHONE_STATE_PERMISSION);
Estoy tratando de usar esta función en nexus 5 api 23 y simplemente no me muestra el cuadro de diálogo como se supone que debe hacer, simplemente no está haciendo nada. ¿Qué podría causar el problema? (este código está en la actividad de Java) Intenté cambiar mi API mínima a 23 y usar requestPermissions () sin ActivityCompat pero todavía no funciona.
apply plugin: ''com.android.application''
android {
compileSdkVersion 23
buildToolsVersion "23.0.2"
defaultConfig {
applicationId "com.example.idanayzen.photomap"
minSdkVersion 23
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile(''proguard-android.txt''), ''proguard-rules.pro''
}
}
}
dependencies {
compile fileTree(dir: ''libs'', include: [''*.jar''])
testCompile ''junit:junit:4.12''
compile ''com.android.support:appcompat-v7:23.1.1''
compile ''com.google.android.gms:play-services:8.4.0''
compile ''com.android.support:design:23.1.1''
}
y el manifiesto:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.idanayzen.photomap">
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_SMS" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="@string/google_maps_key" />
<activity
android:name=".MapsActivity"
android:label="@string/title_activity_maps" />
<activity android:name=".RegisterActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".WrongPhoneNum"></activity>
</application>
</manifest>
Actualicé mi versión de SDK de destino del 22 al 23 y funcionó perfectamente.
Aquí hay un ejemplo del uso de
requestPermissions()
:
Primero, defina el permiso (como lo hizo en su publicación) en el manifiesto; de lo contrario, su solicitud será denegada automáticamente:
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
A continuación, defina un valor para manejar la devolución de llamada de permiso, en onRequestPermissionsResult ():
private final int REQUEST_PERMISSION_PHONE_STATE=1;
Aquí está el código para llamar a requestPermissions ():
private void showPhoneStatePermission() {
int permissionCheck = ContextCompat.checkSelfPermission(
this, Manifest.permission.READ_PHONE_STATE);
if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.READ_PHONE_STATE)) {
showExplanation("Permission Needed", "Rationale", Manifest.permission.READ_PHONE_STATE, REQUEST_PERMISSION_PHONE_STATE);
} else {
requestPermission(Manifest.permission.READ_PHONE_STATE, REQUEST_PERMISSION_PHONE_STATE);
}
} else {
Toast.makeText(MainActivity.this, "Permission (already) Granted!", Toast.LENGTH_SHORT).show();
}
}
Primero, verifica si ya tienes permiso (recuerda, incluso después de que se te haya otorgado el permiso, el usuario puede revocarlo posteriormente en la Configuración de la aplicación).
Y finalmente, así es como verifica si recibió permiso o no:
@Override
public void onRequestPermissionsResult(
int requestCode,
String permissions[],
int[] grantResults) {
switch (requestCode) {
case REQUEST_PERMISSION_PHONE_STATE:
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(MainActivity.this, "Permission Granted!", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(MainActivity.this, "Permission Denied!", Toast.LENGTH_SHORT).show();
}
}
}
private void showExplanation(String title,
String message,
final String permission,
final int permissionRequestCode) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(title)
.setMessage(message)
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
requestPermission(permission, permissionRequestCode);
}
});
builder.create().show();
}
private void requestPermission(String permissionName, int permissionRequestCode) {
ActivityCompat.requestPermissions(this,
new String[]{permissionName}, permissionRequestCode);
}
Esperemos que esto ayude a otros.
Tenía que solicitar permiso para WRITE_EXTERNAL_STORAGE pero no recibía un mensaje emergente a pesar de probar todas las sugerencias diferentes mencionadas.
El culpable al final fue HockeyApp. Utiliza la fusión de manifiesto para incluir su propio permiso para WRITE_EXTERNAL_STORAGE, excepto que aplica una versión máxima de SDK.
La forma de solucionar este problema es incluirlo en su archivo de Manifiesto pero con un reemplazo, para anular la versión y el éxito de HockeyApp.
4.7.2 Otras dependencias que solicitan el permiso de almacenamiento externo (SDK versión 5.0.0 y posterior) Para estar listo para Android O, HockeySDK-Android 5.0.0 y posterior limitan el permiso WRITE_EXTERNAL_STORAGE con el filtro maxSdkVersion. En algunos casos de uso, por ejemplo, cuando una aplicación contiene una dependencia que requiere este permiso, maxSdkVersion hace imposible que esas dependencias otorguen o soliciten el permiso. La solución para esos casos es la siguiente:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:node="replace"/>
Causará que otros atributos de los manifiestos de baja prioridad sean reemplazados en lugar de fusionarse.
Estaba teniendo el mismo problema y lo resolví reemplazando Manifest.permission.READ_PHONE_STATE con android.Manifest.permission.READ_PHONE_STATE.
Esto me acaba de pasar. Resultó que estaba solicitando TODOS los permisos, cuando necesitaba filtrar solo a permisos PELIGROSOS, y de repente comenzó a funcionar.
fun requestPermissions() {
val missingDangerPermissions = PERMISSIONS
.filter { ContextCompat.checkSelfPermission(this, it) != PackageManager.PERMISSION_GRANTED }
.filter { this.getPackageManager().getPermissionInfo(it, PackageManager.GET_META_DATA).protectionLevel == PermissionInfo.PROTECTION_DANGEROUS } // THIS FILTER HERE!
if (missingDangerPermissions.isNotEmpty()) {
Log.i(TAG, "Requesting dangerous permission to $missingDangerPermissions.")
ActivityCompat.requestPermissions(this,
missingDangerPermissions.toTypedArray(),
REQUEST_CODE_REQUIRED_PERMISSIONS);
return
} else {
Log.i(TAG, "We had all the permissions we needed (yay!)")
}
}
La información anterior es buena, pero establecer
targetSdkVersion
en 23 (o superior) es
fundamental
para que Android interprete la etiqueta
<uses-permission>
en el manifiesto como "Preguntaré en código" en lugar de "Exijo tras la instalación".
Muchas fuentes le dirán que necesita la etiqueta
<uses-permission>
, pero nadie dice por qué y si no tiene ese valor establecido, estará tan confundido como yo durante horas y horas.
Me encontré con este problema en Samsung S8 y N8 (no he encontrado en ningún otro)
así que el problema está en el archivo de manifiesto utiliza permiso
<uses-permission android:name="android.permission.CAMERA"
android:requiredFeature="true" />
Por alguna razón, el atributo
android:requiredFeature
es el culpable.
y no he encontrado la explicación de por qué.
para resolver simplemente eliminarlo,
<uses-permission android:name="android.permission.CAMERA" />
No olvides escribir los permisos sin espacios adicionales en el manifiesto. En mi caso tuve:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE " />
Pero mira, al final, hay un espacio extra. Solo escríbelo de la manera correcta
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Y esta funcionando ahora
Para mí, el error estaba en el manifiesto: el permiso estaba en mayúsculas. Android Studio me sugiere los permisos en mayúsculas. Eso no me importa y me tomó dos horas solucionar este problema.
La sintaxis correcta para el permiso es
<usa-permiso android: name = "android.permission.WRITE_EXTERNAL_STORAGE" />
Para mí, el problema era que justo después de hacer la solicitud, mi actividad principal lanzó otra actividad. Eso reemplazó el diálogo para que nunca se viera.
Para mí, el problema era que tenía un código de solicitud no válido. Elijo 0xDEADBEEF como código de solicitud y fallaba silenciosamente (¿tal vez se convierte a algo más pequeño que 32 bits en algún lugar interno?) Si elijo 255 todo funcionó bien como NightSkyDev describió anteriormente.
Para mí, el problema era solicitar un grupo por error en lugar de los permisos reales.
Podría no ser un problema con una sola línea de su código.
En algunos dispositivos (no recuerdo si está en stock con Android), el cuadro de diálogo Permiso incluye una casilla de verificación con la etiqueta "Nunca preguntar de nuevo". Si hace clic en Denegar con la casilla marcada, no se le volverá a solicitar ese permiso, se le negará automáticamente a la aplicación. Para revertir esto, debe ir a Configuración -> Aplicación -> Permisos y volver a habilitar esa permanente para la aplicación. Luego apáguelo para negarlo nuevamente. Es posible que tenga que abrir la aplicación antes de apagarla nuevamente, no estoy seguro.
No sé si tu Nexus lo tiene. Quizás valga la pena intentarlo.
Quizás esta solución podría ayudar a cualquiera en lugar de:
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
utilizar :
ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
entonces agregamos
android.
Manifest.permission.WRITE_EXTERNAL_STORAGE
Reemplazar:
ActivityCompat.requestPermissions(this, new String[]{"Manifest.permission.READ_PHONE_STATE"}, 225);
con:
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE}, 225);
La cadena real para ese permiso
no es
"Manifest.permission.READ_PHONE_STATE"
.
Use el símbolo
Manifest.permission.READ_PHONE_STATE
.
Tuve el mismo problema y resultó ser debido a que la
herramienta de fusión de manifiesto
android:maxSdkVersion
atributo
android:maxSdkVersion
de una dependencia.
Para ver los permisos reales que solicita en su APK, puede usar la herramienta
aapt
, como esta:
/path/to/android-sdk/build-tools/version/aapt d permissions /path/to/your-apk.apk
en mi caso, imprimió:
uses-permission: name=''android.permission.WRITE_EXTERNAL_STORAGE'' maxSdkVersion=''18''
a pesar de que no había especificado un
maxSdkVersion
en mi manifiesto.
Solucioné este problema cambiando
<uses-permission>
en mi manifiesto a:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:remove="android:maxSdkVersion"/>
(donde el espacio de nombres de herramientas es
http://schemas.android.com/tools
)
Tuve este mismo problema. Actualicé a buildToolsVersion "23.0.3" De repente funcionó. Espero que esto ayude a cualquiera que tenga este problema.
me sucedió que lo estaba ejecutando en API 23 y tuve que usar el código para solicitar permiso como este código a continuación lo puse en el método de creación. tenga en cuenta que MY_PERMISSIONS_REQUEST_READ_LOCATION es un número entero que es igual a 1 ejemplo int MY_PERMISSIONS_REQUEST_READ_LOCATION = 1:
if (Build.VERSION.SDK_INT> = Build.VERSION_CODES.M) {requestPermissions (new String [] {Manifest.permission.ACCESS_COARSE_LOCATION}, MY_PERMISSIONS_REQUEST_READ_LOCATION); }