2012-05-04 22 views
5

Esto es totalmente extraño y he buscado a través de los foros.Excepción de seguridad de Android al acceder a los contactos

En mi clase principal tengo un botón onClick que abrirá la aplicación de contactos como se muestra a continuación. Cuando hago clic en el botón, se muestra la lista de contactos, pero tan pronto como toco un contacto aparece una excepción de seguridad.

public void selectContacts(View v) { 
     Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); 
     startActivityForResult(intent, PICK_CONTACT); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    switch (requestCode) { 

     case PICK_CONTACT: 
      if (resultCode == Activity.RESULT_OK) { 
       Uri contactData = data.getData(); 
       Cursor c = managedQuery(contactData, null, null, null, null); 
       while (c.moveToNext()) { 
        String id = c.getString(c.getColumnIndex(ContactsContract.Contacts._ID)); 
        String phoneNumber = getPhoneNumber(id); 
        listOfContacts.add(phoneNumber); 

       } 
      } else { 
       System.out.println("User didn't pick a contact"); 
       finish(); 
      } 
      break; 
     } 

     super.onActivityResult(requestCode, resultCode, data); 
    } 

He comprobado el manifiesto y han intentado todas las combinaciones de la colocación de la etiqueta de usos en el permiso, dentro de la aplicación, la actividad etc, pero nada funciona. Aquí está mi manifiesto.

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="in.company.letsmeet" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk android:minSdkVersion="7" /> 
    <uses-permision android:name="android.permission.SEND_SMS" /> 
    <uses-permision android:name="android.permission.RECEIVE_SMS" /> 
    <uses-permision android:name="android.permission.INTERNET" /> 
    <uses-permision android:name="android.permission.READ_CONTACTS" /> 

    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" > 
     <activity 
      android:name=".LetsmeetActivity" 
      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> 

La excepción de seguridad:

05-04 11:26:39.950: E/AndroidRuntime(3861): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=Intent { dat=content://com.android.contacts/contacts/7 }} to activity {in.company.letsmeet/in.company.letsmeet.LetsmeetActivity}: java.lang.SecurityException: Permission Denial: reading com.android.providers.contacts.SemcContactsProvider2 uri content://com.android.contacts/contacts/7 from pid=3861, uid=10093 requires android.permission.READ_CONTACTS 

será muy apreciada Cualquier ayuda. Estoy intentando esto en Android 2.1 Sony experia S10 mini.

+0

Pruebe primero este [Ejemplo de Commonsware (https://github.com/commonsguy/cw-advandroid/tree/master/Contacts/Pick) en su experiencia sony. Y déjame saber. Si está funcionando o no? – Praveenkumar

+0

Gracias Akhil, el ejemplo del servidor de comunicaciones funciona. Extraño. El manifiesto en ese programa no tiene ningún permiso :) Vamos, no puedo ser tan estúpido. –

+0

Tiene error tipográfico en uses-permision, necesita beuses-permission – yshahak

Respuesta

1

Adivina qué, agregué el permiso READ_CONTACTS en la GUI de manifiesto y funciona. Dios, perdí un día entero en esto. Espero que los demás no tengan que hacerlo.

0

probar a continuación code.That puede ser útil para usted -

public class PickDemo extends Activity { 
private static final int PICK_REQUEST=1337; 
private static Uri CONTENT_URI=null; 

static { 
int sdk=new Integer(Build.VERSION.SDK).intValue(); 

if (sdk>=5) { 
    try { 
    Class<?> clazz=Class.forName("android.provider.ContactsContract$Contacts"); 

    CONTENT_URI=(Uri)clazz.getField("CONTENT_URI").get(clazz); 
    } 
    catch (Throwable t) { 
    Log.e("PickDemo", "Exception when determining CONTENT_URI", t); 
    } 
} 
else { 
    CONTENT_URI=Contacts.People.CONTENT_URI; 
} 
    } 

    @Override 
    public void onCreate(Bundle icicle) { 
super.onCreate(icicle); 

if (CONTENT_URI==null) { 
    Toast 
    .makeText(this, "We are experiencing technical difficulties...", 
       Toast.LENGTH_LONG) 
    .show(); 
    finish(); 

    return; 
} 

setContentView(R.layout.main); 

Button btn=(Button)findViewById(R.id.pick); 

btn.setOnClickListener(new View.OnClickListener() { 
    public void onClick(View view) { 
    Intent i=new Intent(Intent.ACTION_PICK, CONTENT_URI); 

    startActivityForResult(i, PICK_REQUEST); 
    } 
}); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, 
           Intent data) { 
    if (requestCode==PICK_REQUEST) { 
    if (resultCode==RESULT_OK) { 
     startActivity(new Intent(Intent.ACTION_VIEW, 
           data.getData())); 
    } 
} 
    } 
} 

Manifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest android:versionCode="1" 
     android:versionName="1.0" 
     package="com.commonsware.android.contacts.pick" 
     xmlns:android="http://schemas.android.com/apk/res/android"> 

    <uses-sdk android:minSdkVersion="3" 
     android:targetSdkVersion="6" /> 
    <supports-screens android:largeScreens="true" 
       android:normalScreens="true" 
       android:smallScreens="false" /> 
    <application android:icon="@drawable/cw" 
      android:label="@string/app_name"> 
    <activity android:label="@string/app_name" 
      android:name=".PickDemo"> 
    <intent-filter> 
    <action android:name="android.intent.action.MAIN" /> 
    <category android:name="android.intent.category.LAUNCHER" /> 
    </intent-filter> 
    </activity> 
    </application> 
</manifest> 

Y, sólo se refieren Commonsware's example. la esperanza que esto le ayuda.

+0

Gracias. El ejemplo de Commonsware funciona. Mi problema parece estar en la llamada a managedQuery que estoy usando. Si solo tengo que ver el contacto seleccionado como en el ejemplo, comenté la llamada a managedquery y no veo ningún error. ¿Por qué fallaría la llamada managedquery con una excepción de seguridad? –

+0

Disculpe, ¿qué quiere decir aclarado en su método. –

+0

Oh, está bien. Cuando estás comentando tu 'managedQuery' te dará el resultado. ¿Derecha? – Praveenkumar

Cuestiones relacionadas