دریافت چندین شماره موبایل از مخاطبین
ضمن عرض سلام و احترام
بنده در حال نوشتن نرم افزاری هستم که نیاز داره کاربر پس از انتخاب یک گزینه ، لیست مخاطبین گوشی باز بشه و کاربر در میان آنها چند مخاطب را انتخاب کند و سپس شماره موبایل افراد انتخابی در یک آرایه ذخیره شود ؟
برای این کار
1- نیاز به پرمیشن خوندن لیست شماره ها
<uses-permission android:name="android.permission.READ_CONTACTS"/>
2- نیاز به یه لیست ویو با آیتم های قابل انتخاب که برای نمونه با ListActivity و simple_list_item_multiple_choice به عنوان Layout برای ادپتور پیاده سازیش کردم :
public class MainActivity extends ListActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button save_button = (Button) findViewById(R.id.btnSave);
save_button.setOnClickListener(someListener);//کدش رو در ادامه اضافه کردم
Cursor mCursor = getContacts();
startManagingCursor(mCursor);
ListAdapter adapter = new SimpleCursorAdapter(
this,
android.R.layout.simple_list_item_multiple_choice,
mCursor,
new String[]{ContactsContract.Contacts.DISPLAY_NAME},
new int[]{android.R.id.text1});
setListAdapter(adapter);
ListView myListView = getListView();
myListView.setItemsCanFocus(false);
myListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
}
}
3- نیاز به یه دکمه برای هرکاری که لازمه انجام بدی (مثلا همون ثبت تو آرایه - اینجا شماره ها لاگ شدن)
public void onClick(View view) {
long[] id = getListView().getCheckedItemIds();
String[] phoneNumber = new String[id.length];
for (int i = 0; i < id.length; i++) {
phoneNumber[i] = getPhoneNumber(id[i]);
Log.i("PG", "PHONE NUMBER IS : " + phoneNumber[i]);
}
}
با این سه مرحله میتونی چند تا از کانتکت ها رو انتخاب کنی. دوتا تابع اینجا استفاده شده که نیاز به توضیح داره - یکی تابع دریافت لیست کانتکت ها و دومی دریافت شماره تلفن آیتم انتخاب شده.
برای دریافت یه کرسر که قابل معرفی به لیست ویو برای نمایش کانتکت ها باشه از تابع زیر استفاده شده:
private Cursor getContacts() {
Uri uri = ContactsContract.Contacts.CONTENT_URI;
String[] projection = new String[]{ContactsContract.Contacts._ID,
ContactsContract.Contacts.DISPLAY_NAME};
String selection = ContactsContract.Contacts.HAS_PHONE_NUMBER + " = '1'";
String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC";
return managedQuery(uri, projection, selection, null, sortOrder);
}
برای مرحله دوم - یعنی دریافت مثلا شماره تلفن از آیتم انتخاب شده هم مثل بالا نیاز به کرسری هست که بشه با اون روی کانتکت کوئری گرفت :
private Cursor queryPhoneNumbers(long contactId) {
ContentResolver cr = getContentResolver();
Uri baseUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, contactId);
Uri dataUri = Uri.withAppendedPath(baseUri,
ContactsContract.Contacts.Data.CONTENT_DIRECTORY);
Cursor c = cr.query(dataUri,
new String[]{
ContactsContract.CommonDataKinds.Phone._ID,
ContactsContract.CommonDataKinds.Phone.NUMBER,
ContactsContract.CommonDataKinds.Phone.IS_SUPER_PRIMARY,
ContactsContract.RawContacts.ACCOUNT_TYPE,
ContactsContract.CommonDataKinds.Phone.TYPE,
ContactsContract.CommonDataKinds.Phone.LABEL},
ContactsContract.Data.MIMETYPE + "=?",
new String[]{ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE},
null);
if (c != null && c.moveToFirst()) {
return c;
}
return null;
}
و نهایتا متدی که تو کلیک دکمه برای دریافت شماره به کار رفته و از کرسر بالا استفاده میکنه:
private String getPhoneNumber(long id) {
String phone = null;
Cursor phonesCursor = queryPhoneNumbers(id);
if (phonesCursor == null || phonesCursor.getCount() == 0) {
return null;
} else if (phonesCursor.getCount() == 1) {
phone = phonesCursor.getString(phonesCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
} else {
phonesCursor.moveToPosition(-1);
if (phonesCursor.moveToNext()) {
phone = phonesCursor.getString(phonesCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
}
}
return phone;
}
برای Layout این اکتیویتی که از ListActivity مشتق شده یه نکته وجود داره و اون هم اینه که باید لیست ویویی با آیدی پیش فرض رو به فرم اضافه کنیم :
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Save selected items"
android:id="@+id/btnSave"/>
<ListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@android:id/list"/>
</LinearLayout>
کلاس ListActivity صرفا یه راه برای داشتن لیست ویو + یه سری امکانات تو کار اضافه شده به اکتیویتیه و به این معنیه که بدون استفاده از این کلاس و با داشتن یه لیست ویو طبق آموزش ها هم پیاده سازی این مورد امکان پذیره. صرفا بابت مثال و آشنایی با یه سری موارد توکار لحاظ شده، ازش استفاده شد.
با سلام
در پی نوشتن برنامه ای بودم تا لیست تمامی شماره های گوشی رو دریافت کرده و بعد از اعمال برخی تغییرات روی شماره ها، تغییرات را ذخیره کنم. تا اینجا جلو رفته ام ولی فقط یه جا اشکال منطقی دارم که از دوستان درخواست کمک دارم
مشکل کار: آندسته از مخاطبینی که دارای دو یا چند شماره از یک نوع خاص(موبایل) رو دارند فقط یکی شون تغییر میکنه.
لطفا راهنماییم کنید (قطعه کد باشه که خیلی عالیه)
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .