2012-07-05 33 views
0

我正在使用Android 2.1 platform.Going做一個基於DropBox.I項目使用DBUtility類在DropBox中列出聯繫人。 DBUtility不是一個主類。它是一個子類。主類調用這個類的一些函數。類不工作,錯誤發生?

有人seperately工作良好,Createfolder()在下面的代碼只包含一個聲明

mDBApi.createFolder( 「聯繫人」);

有作爲above.when我提到的基礎上增加了聯繫。我的一些代碼有錯誤像

無差錯「的方法getContentResolver()是未定義的類型DropBoxUtility」

代碼

public class DropBoxUtility { 
    private DropboxAPI<AndroidAuthSession> mDBApi; 
    public DropBoxUtility(DropboxAPI<AndroidAuthSession> Api) { 
     mDBApi = Api; 
    } 

    public void ContactFolder() throws DropboxException { 
     mDBApi.createFolder("Contacts"); 
     ArrayAdapter<String>itemAdapter; 
     ArrayList<String> contactlist = new ArrayList<String>(); 
     String displayName="All Contacts Here"; 
     ByteArrayInputStream inputStream = new ByteArrayInputStream(displayName.getBytes()); 
     Entry newEntry = mDBApi.putFile("Contacts/abhi.doc", inputStream, displayName.length(), null, null);  

     /* I got Error on this line */ 
     ContentResolver cr = getContentResolver() ; 
     Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); 

     while (cursor.moveToNext()) { 
      displayName = ""; 
      displayName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); 
      String id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); 
      String holder = ""; 
      holder = holder + displayName; 

      /* Phone Number and Type */ 
      ArrayList<String> phoneList = new ArrayList<String>(); 
      if (Integer.parseInt(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) { 
       Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", new String[] { id }, null); 

      while (pCur.moveToNext()) { 

       int phoneType = pCur 
         .getInt(pCur 
           .getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE)); 
       String pnum = pCur.getString(pCur 
         .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 

       switch (phoneType) { 
       case ContactsContract.CommonDataKinds.Phone.TYPE_HOME: 
        phoneList.add(", Home, "+pnum); 
        break; 
       case ContactsContract.CommonDataKinds.Phone.TYPE_WORK: 
        phoneList.add(", Work, "+pnum); 
        break; 
       case ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE: 
        phoneList.add(", Mobile, "+pnum); 
        break; 
       case ContactsContract.CommonDataKinds.Phone.TYPE_OTHER: 
        phoneList.add(", Other, "+pnum); 
        break; 
       } 
      } // end of while 

      pCur.close(); 
     }  // end of if 

     /* Email */ 
     Cursor emails = cr.query(Email.CONTENT_URI, null, Email.CONTACT_ID 
       + " = " + id, null, null); 

     ArrayList<String> emailList = new ArrayList<String>(); 

     while (emails.moveToNext()) { 
      int emailType = emails 
        .getInt(emails 
          .getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE)); 
      String email = emails.getString(emails 
        .getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)); 

      switch (emailType) { 
      case ContactsContract.CommonDataKinds.Email.TYPE_HOME: 
       emailList.add(", Home, "+email); 
       break; 
      case ContactsContract.CommonDataKinds.Email.TYPE_WORK: 
       emailList.add(", Work, "+email); 
       break; 
      case ContactsContract.CommonDataKinds.Email.TYPE_MOBILE: 
       emailList.add(", Mobile, "+email); 
       break; 
      case ContactsContract.CommonDataKinds.Email.TYPE_OTHER: 
       emailList.add(", Other, "+email); 
       break; 
      } 
     } 
     emails.close(); 


     if(phoneList.size()>=emailList.size()) { 
      for(int i=0;i<phoneList.size();i++) { 
       holder = displayName + phoneList.get(i); 
       try{ 
        holder = holder + emailList.get(i); 
       }catch(Exception ex){ 
        holder = holder + ", , "; 
       } 
       contactlist.add(holder); 
      } 
     }else { 
      for(int i=0;i<emailList.size();i++) { 
       try{ 
        holder = displayName+ phoneList.get(i); 
       }catch(Exception ex){ 
        holder = holder + ", , "; 
       } 
       holder = holder + emailList.get(i); 
       contactlist.add(holder); 
      } 
     } 
    } 
    Collections.sort(contactlist); 
    cursor.close(); 

} 

logcat的

07-05 14:57:54.734: W/dalvikvm(392): threadid=3: thread exiting with uncaught exception (group=0x4001b188) 
07-05 14:57:54.734: E/AndroidRuntime(392): Uncaught handler: thread main exiting due to uncaught exception 
07-05 14:57:54.744: E/AndroidRuntime(392): java.lang.SecurityException: Permission Denial: reading com.android.providers.contacts.ContactsProvider2 uri content://com.android.contacts/contacts from pid=392, uid=10028 requires android.permission.READ_CONTACTS 
07-05 14:57:54.744: E/AndroidRuntime(392):  at android.os.Parcel.readException(Parcel.java:1218) 
07-05 14:57:54.744: E/AndroidRuntime(392):  at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:160) 
07-05 14:57:54.744: E/AndroidRuntime(392):  at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:114) 
07-05 14:57:54.744: E/AndroidRuntime(392):  at android.content.ContentProviderProxy.bulkQuery(ContentProviderNative.java:326) 
07-05 14:57:54.744: E/AndroidRuntime(392):  at android.content.ContentProviderProxy.query(ContentProviderNative.java:345) 
07-05 14:57:54.744: E/AndroidRuntime(392):  at android.content.ContentResolver.query(ContentResolver.java:202) 
07-05 14:57:54.744: E/AndroidRuntime(392):  at com.abhi.DropBoxUtility.ContactFolder(DropBoxUtility.java:47) 

如何解決這個問題呢?

回答

1

getContentResolver方法存在於Context類。您可以直接從活動中調用它,因爲活動是一種上下文。您的DropBoxUtility不是Activity,因此您需要有一個上下文才能使用getContentResolver方法。最簡單的事情就是把它傳遞給構造函數:

public class DropBoxUtility 
{ 
    private DropboxAPI<AndroidAuthSession> mDBApi; 
    private Context context; 

    public DropBoxUtility(DropboxAPI<AndroidAuthSession> Api, Context ctx) 
    { 
     mDBApi = Api; 
     context = ctx; 
    } 

    ... 
} 

然後,當你需要撥打電話,使用context.getContentResolver()

你會從你的活動實例化這個類作爲new DropBoxUtility(api, this);

編輯:讀取聯繫人信息,你需要相應的權限添加到您的清單:

<uses-permission android:name="android.permission.READ_CONTACTS"/> 
+0

@Hari你更改定義我展示給你的DropBoxUtility類和構造函數?你從哪裏實例化類?它可以從一個活動或某個有「上下文」的地方完成。 – 2012-07-05 08:58:09

+0

我編輯我的代碼... mDBApi = new DropboxAPI (session); \t \t mDbUtility = new DropBoxUtility(mDBApi); \t \t mDbUtility = new DropBoxUtility(mDBApi,this); \t \t setContentView(R.layout.main); – Hari 2012-07-05 09:06:31

+0

它現在正在工作,但應用程序意外停止..我發佈了logcat錯誤 – Hari 2012-07-05 09:30:00

0

我不知道對於的Dropbox API,但肯定我可以指出這個錯誤,是getContentResolver()的是Android 活動類的方法不是DropBoxUtility,你可以在不同的使用方法使用該活動的上下文(參考)

通過Android活動的上下文中DropBoxUtility構造,並使用該上下文 等,

ContentResolver cr = mContext.getContentResolver(); // Here mContext is a reference of your Activity class from which your are calling this DropBox class. 

嘗試此,

0

DropBoxUtility不從提供getContentResolver方法的任何類繼承(即Activity)。要麼必須從另一個班級派生班級,要麼必須申報並實施getContentResolver方法。

正如user370305所說,您可以將Activity的實例傳遞給DropBoxUtility類的構造函數,並調用該實例的方法。