2012-05-04 12 views
5

Das ist total komisch und ich habe durch die Foren gesucht.Android Security Ausnahme beim Zugriff auf Kontakte

In meiner Hauptklasse habe ich eine Schaltfläche onClick wird die Kontaktanwendung wie unten gezeigt starten. Wenn ich auf die Schaltfläche klicke, wird die Kontaktliste angezeigt, aber sobald ich auf einen Kontakt klicke, wird eine Sicherheitsausnahme ausgelöst.

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); 
    } 

Ich habe das Manifest überprüft und haben alle Kombinationen versucht, von der Uses-Erlaubnis-Tag Platzierung innerhalb der Anwendung, Aktivität usw. Aber nichts funktioniert. Hier ist mein Manifest.

<?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> 

Die Sicherheitsausnahme:

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 

Jede Hilfe wird sehr geschätzt. Ich versuche dies auf Android 2.1 Sony Experia S10 Mini.

+0

Probieren Sie dieses [Commonsware Beispiel] (https://github.com/commonsguy/cw-advandroid/tree/master/Contacts/Pick) zuerst in Ihrem Sony Experia aus. Und lass mich wissen. Ob es funktioniert oder nicht? – Praveenkumar

+0

Danke Akhil, das Beispiel der Commnware funktioniert. Seltsam. Das Manifest in diesem Programm hat überhaupt keine Berechtigungen :). Komm schon, ich kann nicht so dumm sein. –

+0

Sie haben Tippfehler in der Verwendung-Permission, brauchen die Erlaubnis-Erlaubnis – yshahak

Antwort

1

Also raten Sie mal, ich habe die READ_CONTACTS-Berechtigung in der Manifest-GUI hinzugefügt und es funktioniert. Gott, ich habe einen ganzen Tag damit verschwendet. Hoffe, andere müssen nicht.

0

Versuchen unter code.That out kann hilfreich sein -

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> 

Und nur Commonsware's example. Hoffnung, dies hilft Ihnen beziehen.

+0

Danke. Das Beispiel von Commonsware funktioniert. Mein Problem scheint in dem von mir verwendeten Aufruf von managedQuery zu liegen. Wenn ich nur wie im Beispiel den ausgewählten Kontakt anzeigen muss, habe ich den Aufruf von managedquery kommentiert und sehe keinen Fehler. Warum sollte der Aufruf von managedquery mit einer Sicherheitsausnahme fehlschlagen? –

+0

Sorry, wie meinst du das in deiner Methode geklärt. –

+0

Oh ok. Wenn Sie Ihre "managedQuery" kommentieren, erhalten Sie das Ergebnis. Recht? – Praveenkumar

Verwandte Themen