0

私はAndroid2.1プラットフォームを使用しています。DropBoxに基づいて1つのプロジェクトを実行します。DropBoxの連絡先を一覧表示するためにDBUtilityクラスを使用しました。DBUtilityはメインクラスではありません。サブクラスです。メインクラスは、このクラスからいくつかの関数を呼び出します。

それは別々にうまく機能していました、以下のコードのCreatefolder()には1つのステートメントしか含まれていません

mDBApi.createFolder( "連絡先");

上記のようなエラーはありませんでした。連絡先に基づいてコードを追加すると、次のようなエラーが発生しました。

「メソッド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)

この問題を解決する方法は?

4

3 に答える 3

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"/>
于 2012-07-05T08:47:31.887 に答える
0
// I got Error on this line     ContentResolver cr = getContentResolver() ;

DropBox apiについてはわかりませんが、確かにこのエラーを指摘できます。これgetContentResolver()は Android Activityクラスのメソッドであり、 DropBoxUtility用ではありません。その activity の context(reference) を使用して、このメソッドを別のクラスで使用できます。

Android アクティビティのコンテキストを DropBoxUtility コンストラクターに渡し、そのコンテキストを次のように使用します。

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

これを試して、

于 2012-07-05T08:46:37.910 に答える
0

このクラスは、メソッドを提供するクラス (つまり)DropBoxUtilityから継承しません。別のクラスからクラスを派生させるか、メソッドを宣言して実装する必要があります。getContentResolverActivitygetContentResolver

user370305 が言うように、のインスタンスをクラスActivityのコンストラクターに渡し、そのインスタンスでメソッドを呼び出すことができます。DropBoxUtility

于 2012-07-05T08:46:59.013 に答える