2012-05-04 26 views
5

Điều này hoàn toàn lạ và tôi đã tìm kiếm qua các diễn đàn.Ngoại lệ bảo mật của Android khi truy cập danh bạ

Trong lớp học chính của tôi, tôi có nút onClick sẽ khởi chạy ứng dụng danh bạ như được hiển thị bên dưới. Khi tôi nhấp vào nút, danh sách liên lạc của anh ta được hiển thị nhưng ngay sau khi tôi gõ vào một số liên lạc một ngoại lệ bảo mật được ném.

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

Tôi đã kiểm tra tệp kê khai và đã thử tất cả kết hợp đặt thẻ quyền sử dụng, trong ứng dụng, hoạt động, v.v. Đây là bản kê khai của tôi.

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

Trường hợp ngoại lệ an ninh:

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 

Bất kỳ trợ giúp sẽ được đánh giá cao. Tôi đang thử điều này trên Android 2.1 Sony experia S10 mini.

+0

Hãy thử [Ví dụ của Commonsware] này (https://github.com/commonsguy/cw-advandroid/tree/master/Contacts/Pick) trong sony experia của bạn trước tiên. Và, cho tôi biết. Cho dù nó hoạt động hay không? – Praveenkumar

+0

Cảm ơn Akhil, ví dụ của commnsware hoạt động. Lạ thật. Tệp kê khai trong chương trình đó không có bất kỳ quyền nào cả :). Tôi không thể ngu ngốc được. –

+0

Bạn có lỗi đánh máy trong sử dụng-permision, cần phải xin phép – yshahak

Trả lời

1

Vì vậy, hãy đoán điều gì, tôi đã thêm quyền READ_CONTACTS trong GUI Manifest và nó hoạt động. Chúa tôi đã lãng phí cả ngày vào chuyện này. Hy vọng những người khác không phải.

0

Thử dưới code.That có thể hữu ích cho bạn -

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> 

Và, chỉ cần tham khảo Commonsware's example. Hy vọng điều này sẽ giúp bạn.

+0

Cảm ơn. Ví dụ của Commonsware hoạt động. Vấn đề của tôi dường như nằm trong cuộc gọi managedQuery mà tôi đang sử dụng. Nếu tôi chỉ cần xem liên hệ đã chọn như trong ví dụ, tôi đã nhận xét cuộc gọi được quản lý và tôi không thấy bất kỳ lỗi nào. Tại sao cuộc gọi managedquery lại thất bại với một ngoại lệ bảo mật. –

+0

Xin lỗi làm thế nào bạn có nghĩa là xóa trong phương pháp của bạn. –

+0

Oh ok. Khi bạn nhận xét 'managedQuery' của bạn sẽ cung cấp cho bạn kết quả. Đúng? – Praveenkumar

Các vấn đề liên quan