ProfessionalAndroid2アプリケーション開発のチュートリアルアプリケーションで問題が発生しています。私はAndroid2.3用に開発していますが、リビジョンでコードがかなり変更されているようです。
基本的に、2つのアクティビティがあります。1つは連絡先のリストを取得し、選択した連絡先を最初のアクティビティに戻して画面に表示します。Androidにはすでにこれを行うものがあることはわかっていますが、ここで学ぼうとしています:p
アクティビティ間のすべての通信は、インテントを使用して処理されます。最初のアクティビティは他のアクティビティを正常に開始します。連絡先を選択すると、最初のアクティビティに戻ります。それはonReturnActivity()
すべてうまく動作します。しかし、カーソルを作成して(を使用してmanagedQuery()
)onReturnActivity()
返された単一の連絡先データベースエントリを開こうとすると、すべてが洋ナシの形になり、IllegalArgumentExceptionが発生します。
返されるURIパスは、content://com.android.contacts/contacts15(または別の番号)です。
エラーは次のとおりです。
java.lang.RuntimeException: Failure delivering result ResultInfo {
who=null, request=1, result=-1, data=Intent {
dat=content://com.android.contacts/contacts15 }}
to activity {com.paad.contactPicker/com.paad.contactPicker.ContactPickerTester}:
java.lang.IllegalArgumentException:
URI: content://com.android.contacts/contacts15,
calling user: com.paad.contactPicker,
calling package:com.paad.contactPicker
ただし、他のアクティビティでカーソルを作成することは問題なく機能するため、(Androidに関する知識が非常に限られているため)私が考えることができるのは、URIパス、または他のアクティビティから返されたエントリに何も含まれていないという問題だけです。しかし、私はそれが最初だと信じる傾向があります。
すべての権限が設定され、他のアクティビティで連絡先データベースにアクセスできます。
これについていくつかの助けを本当にいただければ幸いです、私は過去2日間立ち往生しています:/
編集
これが2番目のアクティビティの呼び出しです。
public void onClick(View _view) {
Intent intent = new Intent(Intent.ACTION_PICK, Uri.parse("content://android.provider.ContactsContract")) ;
startActivityForResult(intent, PICK_CONTACT) ;
}
ただし、このインテントに渡すURIは実際には使用しませんが、次のように2番目のアクティビティにハードコードしています。
final Uri data = ContactsContract.Contacts.CONTENT_URI ;
そして、これが私が初めてmanagedQuery()を呼び出す場所です(それが機能する場所):
final Cursor c = managedQuery(data, null, null, null, null) ;
onReturnアクティビティは次のとおりです。publicvoidonActivityResult(int reqCode、int resCode、Intent data){super.onActivityResult(reqCode、resCode、data);
switch(reqCode) {
case(PICK_CONTACT) : {
if(resCode == Activity.RESULT_OK) {
Uri contactData = data.getData() ;
Cursor c = managedQuery(contactData, null, null, null, null) ;
c.moveToFirst() ;
String name = c.getString(c.getColumnIndexOrThrow("DISPLAY_NAME")) ;
TextView tv = (TextView)findViewById(R.id.textView2) ;
tv.setText(name) ;
}
}
break ;
}
}