質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

1回答

3955閲覧

電話番号の取得について質問したいのですが

RNagamatsu

総合スコア13

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

1クリップ

投稿2017/03/24 06:28

ボタンを押すと、端末の電話帳に登録されている電話番号を取得して、それを保存し、着信があるたびに保存した電話番号と突き合わせる仕組みを作りたいと思っています。

ContentResolverから電話番号をcursor型で取得し、それをString型の配列に格納し、データを保存する。
しかし、どうも格納できていないのです。

これがコードです。

ContentResolver contentResolver = getContentResolver(); Cursor addressTable = contentResolver.query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, // データの種類 null, // 項目 ContactsContract.Data.MIMETYPE + " = ?", // フィルタ条件 new String[]{ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE}, // フィルタ用パラメータ null // ソート ); addressTable.moveToFirst(); int count = addressTable.getCount(); int index = addressTable.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER); String[] phoneNumberList = new String[count]; for(int i = 0; i <count; i++) { while (index < count) { phoneNumberList[i] = addressTable.getString(index); addressTable.moveToNext(); } } SaveData(); Dialog(title, phoneNumberList);

きちんと格納できているか、Dialogメソッドを別に作って表示をこころみたのですが、内容が出力されないのです。

ちなみに、Dialog()はこうです。

public void Dialog(String title, String[] phoneLists) {
this.alertDialogBuilder.setTitle(title);
this.alertDialogBuilder.setItems(phoneLists, this);
AlertDialog builder = this.alertDialogBuilder.create();
builder.show();
}

ContentResolverの使い方が間違っているのでしょうか?
それともString型の配列にする方法が悪いのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

タグはAndroidですかね。

本題ですが
まずcontentResolver.queryのフィルターは何のためでしょうか?
ここが正しくないと値が0だったりします。
なのでcountが0になっていないか等をLogで確認したりするといいですね。

全件取るならこんな形でいけるかと思いますので参考に。
あとCursorは使い終わったらCloseをしてください。
お約束です。

Cursor addressTable = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,null,null, null); if(addressTable != null) { //名前のindex int index1 = addressTable.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME); //電話番号のindex int index2 = addressTable.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER); while (addressTable.moveToNext()) { String name = addressTable.getString(index1); String phoneNumber = addressTable.getString(index2); // TAGはわかりやすい名称をStringで Log.i(TAG, name + ":" + phoneNumber); } addressTable.close(); }

それとforの部分も実際動かしていないですが見直しを。
なんとなく動いてしまいそうですが。。

Cursor単体でデータリストはできますのでforの中で何度も回す意味がありません。
whileの条件部分でmoveToNext()をすれば最後までmoveし終わったら抜けますのでその中で処理できます。
上記のコードを参考にしてみてください。
もしもwhileだと配列のインデックスが分からないというのであればいったんListにaddしていってそこから配列に変換してあげてもいいと思います。

分かりづらければすいません。

投稿2017/03/24 14:12

編集2017/03/24 14:43
uniko

総合スコア448

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

RNagamatsu

2017/03/24 21:55 編集

ありがとうございます! 現在出先でパソコンが触れませんので、明日になりますがアドバイスどおりやってみます! すみませんタグはAndroid studioだったかと思います。 cursorを閉じるのも他のサイトで言われてましたがいじくり回すうちになくなってました。 お恥ずかしい限りです。
uniko

2017/03/24 22:27

いえいえ、初心者マークがついてましたので念のためと記載させていただきました。
RNagamatsu

2017/03/27 05:12

今更ですが、ありがとうございます! Logcatを見ると格納できてました!
uniko

2017/03/27 05:18

解決したようでようございました。 回答にwhileについての記載、なんとなく動きそうと記載していましたが動いたら無限ループに入りますね。この部分、間違い申し訳ありません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問