ubicacion studio solicitar permisos permiso peligrosos pedir para multiples internet camara almacenamiento android android-6.0-marshmallow

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:

  1. Tenga el elemento <uses-permission> en el manifiesto como normal.

  2. Llame a Settings.System.canWrite() para ver si es elegible para escribir la configuración.

  3. Si canWrite() devuelve false , inicie la actividad ACTION_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 .