Java.lang.SecurityException intentando leer desde los contactos de Android URI
Estoy tratando de leer los nombres de los contactos, números de teléfono y correos electrónicos del URI de ContactsContract
, y estoy obteniendo una excepción de SecurityException
cuando intento ejecutar el programa. He establecido el permiso en el archivo AndroidManifest.xml
:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="edu.smumn.cs394" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="8" /> **<uses-permission android:name="android.pemission.READ_CONTACTS"/>** <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".ReadPhoneNumbers" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>`
El siguiente es el código de la aplicación:
- De android - CHANGE_COMPONENT_ENABLED_STATE
- Init.rc no iniciar mi servicio en el primer arranque después del flash
- android internet no funciona
- Android Java: Desactivar la pantalla
- ¿Por qué el comando SQLite 3 que usa la shell ADB de Android devuelve "permiso denegado"?
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.contact_list); ContentResolver resolver = getContentResolver(); Cursor c = resolver.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); //[...] Work through data here`
Recibo una excepción de seguridad en la última línea ( resolver.query()
):
`03-08 07:41:40.812: ERROR/AndroidRuntime(416): FATAL EXCEPTION: main 03-08 07:41:40.812: ERROR/AndroidRuntime(416): java.lang.RuntimeException: Unable to start activity ComponentInfo{edu.smumn.cs394/edu.smumn.cs394.ReadPhoneNumbers}: java.lang.SecurityException: Permission Denial: reading com.android.providers.contacts.ContactsProvider2 uri content://com.android.contacts/contacts from pid=416, uid=10037 requires android.permission.READ_CONTACTS [...] 03-08 07:41:40.812: ERROR/AndroidRuntime(416): Caused by: java.lang.SecurityException: Permission Denial: reading com.android.providers.contacts.ContactsProvider2 uri content://com.android.contacts/contacts from pid=416, uid=10037 requires android.permission.READ_CONTACTS [...] 03-08 07:41:40.812: ERROR/AndroidRuntime(416): at edu.smumn.cs394.ReadPhoneNumbers.onCreate(ReadPhoneNumbers.java:30)
[…] `
Debo estar extrañando algo, pero no puedo imaginar qué.
- Firebase + Permisos
- Definir un permiso para que aplicaciones de terceros se usen en Android
- ¿Google Analytics agrega permiso de wakelock?
- Google Play muestra el permiso implícito READ_EXTERNAL_STORAGE
- Uso de libusb en Android sin enraizamiento
- Proveedor de contenido grant uri permission
- Conceder a la aplicación Android el permiso de android.permission.INTERNET mientras se depura en el dispositivo
- se ha intentado solicitar nuevos permisos para una sesión que tiene una solicitud pendiente
Asegúrese de agregarla fuera de la etiqueta de la aplicación. Durante el desarrollo de una plataforma de destino de 2.3.3 con Eclipse en Ubuntu, tuve fallos de permisos en el archivo de registro que indicaban que necesitaba esta línea exacta mientras trabajaba en algo similar. No fue hasta que moví la línea * uses-permission … READ_CONTACTS * fuera de la etiqueta de la aplicación que funcionaba.
Solicitar permisos en tiempo de ejecución
A partir de Android 6.0 (API nivel 23), los usuarios conceden permisos a las aplicaciones mientras se ejecuta la aplicación, no cuando instalan la aplicación.
Si el permiso que necesita agregar no aparece en los permisos normales, tendrá que tratar con "Permisos de tiempo de ejecución". Los permisos de tiempo de ejecución son permisos que se solicitan cuando se necesitan mientras se ejecuta la aplicación. Estos permisos mostrarán un diálogo al usuario, similar al siguiente:
El primer paso al agregar un "Permiso de tiempo de ejecución" es agregarlo al AndroidManifest:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.codepath.androidpermissionsdemo" > <uses-permission android:name="android.permission.READ_CONTACTS" /> ... </manifest>
A continuación, deberá iniciar la solicitud de permiso y manejar el resultado. El siguiente código muestra cómo hacerlo en el contexto de una actividad, pero esto también es posible desde dentro de un fragmento.
// MainActivity.java public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // In an actual app, you'd want to request a permission when the user performs an action // that requires that permission. getPermissionToReadUserContacts(); } // Identifier for the permission request private static final int READ_CONTACTS_PERMISSIONS_REQUEST = 1; // Called when the user is performing an action which requires the app to read the // user's contacts public void getPermissionToReadUserContacts() { // 1) Use the support library version ContextCompat.checkSelfPermission(...) to avoid // checking the build version since Context.checkSelfPermission(...) is only available // in Marshmallow // 2) Always check for permission (even if permission has already been granted) // since the user can revoke permissions at any time through Settings if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) { // The permission is NOT already granted. // Check if the user has been asked about this permission already and denied // it. If so, we want to give more explanation about why the permission is needed. if (shouldShowRequestPermissionRationale( Manifest.permission.READ_CONTACTS)) { // Show our own UI to explain to the user why we need to read the contacts // before actually requesting the permission and showing the default UI } // Fire off an async request to actually get the permission // This will show the standard permission request dialog UI requestPermissions(new String[]{Manifest.permission.READ_CONTACTS}, READ_CONTACTS_PERMISSIONS_REQUEST); } } // Callback with the request from calling requestPermissions(...) @Override public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) { // Make sure it's our original READ_CONTACTS request if (requestCode == READ_CONTACTS_PERMISSIONS_REQUEST) { if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { Toast.makeText(this, "Read Contacts permission granted", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(this, "Read Contacts permission denied", Toast.LENGTH_SHORT).show(); } } else { super.onRequestPermissionsResult(requestCode, permissions, grantResults); } } }
Hola Steven el rastreo de registro de depuración le indica que necesita … requiere android.permission.READ_CONTACTS
Así que intenta algo editando el Manifest.xml como añadir otro permiso, deja ver si no se lee correctamente.
Y compruebe esta línea sin **
<uses-permission android:name="android.permission.READ_CONTACTS" />
Dan
Con la api 23, permiso no funciona, cambia el nivel de api en el emulador para api 22 (piruleta) o inferior
Si el dispositivo está ejecutando Android 6.0 o superior y el SDK de destino de la aplicación es 23 o superior: La aplicación debe enumerar los permisos en el manifiesto y debe solicitar cada permiso peligroso que necesita mientras se ejecuta la aplicación. El usuario puede conceder o denegar cada permiso, y la aplicación puede seguir ejecutándose con capacidades limitadas incluso si el usuario niega una solicitud de permiso.
EJEMPLO:
//thisActivity is the running activity if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) { // Should we show an explanation? if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity, Manifest.permission.READ_CONTACTS)) { // Show an expanation to the user *asynchronously* -- don't block // this thread waiting for the user's response! After the user // sees the explanation, try again to request the permission. } else { // No explanation needed, we can request the permission. ActivityCompat.requestPermissions(thisActivity, new String[]{Manifest.permission.READ_CONTACTS}, MY_PERMISSIONS_REQUEST_READ_CONTACTS); // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an // app-defined int constant. The callback method gets the // result of the request. } }
http://developer.android.com/training/permissions/requesting.html
- Cómo cargar imágenes de la carpeta mipmap por programa?
- AsyncTask's doInBackground inicia su ejecución demasiado tarde después de AsyncTask :: execute se llama