studio - permisos para camara android
No se puede obtener el permiso WRITE_SETTINGS (7)
Cuando tengo una API objetivo de 23 en Android M Preview 3, parece que no puedo obtener el permiso Manifest.permission.WRITE_SETTTINGS.
requestPermissions(new String[]{Manifest.permission.WRITE_SETTINGS},
101);
Solicitar permiso no muestra el diálogo que esperaría, pero si hago la siguiente llamada sin este permiso,
RingtoneManager.setActualDefaultRingtoneUri(activity, RingtoneManager.TYPE_RINGTONE, ringUri);
La llamada será excepto porque no tengo el permiso.
No estoy seguro de a dónde ir desde aquí. ¿Hay una nueva API de tonos de llamada para 23? ¿O este cambio de permiso hizo imposible que cualquier aplicación que no sea del sistema cambie el tono de llamada?
A partir de Android Marshmellow, debe usar permisos de tiempo de ejecución que apuntan a una mayor seguridad, o usar permisos cuando sea necesario aquí es documenatation
y para la documentación de configuración de escritura está here
En manifiesto agregar
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
En tu clase
private boolean checkSystemWritePermission() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if(Settings.System.canWrite(context))
return true;
else
openAndroidPermissionsMenu();
}
return false;
}
private void openAndroidPermissionsMenu() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);
intent.setData(Uri.parse("package:" + context.getPackageName()));
context.startActivity(intent);
}
}
Y úsalo así
try {
if (checkSystemWritePermission()) {
RingtoneManager.setActualDefaultRingtoneUri(context, RingtoneManager.TYPE_RINGTONE, newUri);
Toast.makeText(context, "Set as ringtoon successfully ", Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(context, "Allow modify system settings ==> ON ", Toast.LENGTH_LONG).show();
}
} catch (Exception e) {
Log.i("ringtoon",e.toString());
Toast.makeText(context, "unable to set as Ringtoon ", Toast.LENGTH_SHORT).show();
}
Además de la respuesta de CommonsWare y el comentario de Ogix, aquí hay un código ficticio:
private boolean checkSystemWritePermission() {
boolean retVal = true;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
retVal = Settings.System.canWrite(this);
Log.d(TAG, "Can Write Settings: " + retVal);
if(retVal){
Toast.makeText(this, "Write allowed :-)", Toast.LENGTH_LONG).show();
}else{
Toast.makeText(this, "Write not allowed :-(", Toast.LENGTH_LONG).show();
FragmentManager fm = getFragmentManager();
PopupWritePermission dialogFragment = new PopupWritePermission();
dialogFragment.show(fm, getString(R.string.popup_writesettings_title));
}
}
return retVal;
}
El Fupment PopupwritePermission luego muestra una ventana donde se explica la situación. Un clic en el botón Aceptar abrirá el menú del sistema Android donde se puede otorgar el permiso:
private void openAndroidPermissionsMenu() {
Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);
intent.setData(Uri.parse("package:" + getActivity().getPackageName()));
startActivity(intent);
}
El permiso
android.permission.WRITE_SETTINGS
ahora está en la
signature|appop|pre23|preinstalled
del grupo
signature|appop|pre23|preinstalled
como
android.permission.CHANGE_NETWORK_STATE
y
android.permission.SYSTEM_ALERT_WINDOW
Esto significa que lo obtienes en SDK 22 y debajo. En la versión más nueva, debes ser un operador de aplicaciones.
Este es un ejemplo completo:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (Settings.System.canWrite(context) {
// Do stuff here
}
else {
Intent intent = new Intent(android.provider.Settings.ACTION_MANAGE_WRITE_SETTINGS);
intent.setData(Uri.parse(“package:” + getActivity().getPackageName()));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
}
Las respuestas anteriores son geniales, solo tengo una pequeña adición para obtener también el resultado de la solicitud de permiso.
public static void youDesirePermissionCode(Activity context){
boolean permission;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
permission = Settings.System.canWrite(context);
} else {
permission = ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_SETTINGS) == PackageManager.PERMISSION_GRANTED;
}
if (permission) {
//do your code
} else {
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);
intent.setData(Uri.parse("package:" + context.getPackageName()));
context.startActivityForResult(intent, MainActivity.CODE_WRITE_SETTINGS_PERMISSION);
} else {
ActivityCompat.requestPermissions(context, new String[]{Manifest.permission.WRITE_SETTINGS}, MainActivity.CODE_WRITE_SETTINGS_PERMISSION);
}
}
}
Y luego en la
Activity
:
@SuppressLint("NewApi")
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == MainActivity.CODE_WRITE_SETTINGS_PERMISSION && Settings.System.canWrite(this)){
Log.d("TAG", "MainActivity.CODE_WRITE_SETTINGS_PERMISSION success");
//do your code
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == MainActivity.CODE_WRITE_SETTINGS_PERMISSION && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//do your code
}
}
Mencione debajo del permiso en AndroidManifest.xml
En la Actividad, utilice a continuación si es más para cambiar la configuración
if(Settings.System.canWrite(this)){
// change setting here
}
else{
//Migrate to Setting write permission screen.
Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);
intent.setData(Uri.parse("package:" + mContext.getPackageName()));
startActivity(intent);
}
Para usar
WRITE_SETTINGS
, según los documentos:
-
Tenga el elemento
<uses-permission>
en el manifiesto como normal. -
Llame a
Settings.System.canWrite()
para ver si es elegible para escribir la configuración. -
Si
canWrite()
devuelvefalse
, inicie la actividadACTION_MANAGE_WRITE_SETTINGS
para que el usuario pueda aceptar que su aplicación realmente escriba en la configuración.
En otras palabras, escribir en la configuración ahora es una doble opción (aceptar instalar, aceptar por separado en Configuración para permitir), similar a las API de administración del dispositivo, servicios de accesibilidad, etc.
También tenga en cuenta que todavía no he intentado usarlos, esto se basa en una investigación que hice ayer sobre los cambios de Android 6.0 .