کانال بله, جهت پشتیبانی و اطلاع رسانی کانال بله, جهت پشتیبانی و اطلاع رسانی
عضویت

دسترسی به تامین کننده محتوا « دفترچه تلفن »

دفترچه تلفن در اندروید
شرح مختصر پروژه

دسترسی به تامین کننده محتوا « دفترچه تلفن » استخراج تمامی آدرس های پست الکترونیکی ثبت شده کاربران موجود در دفترچه تلفن

توضیحات پروژه

دوره آموزش اندروید

دوره آموزش برنامه نویسی اندروید

با عرض سلام و خسته نباشید به شما دانشجویان محترم آموزشگاه تحلیلگر داده ها. در این مقاله قصد داریم تا نحوه دسترسی به داده های تامین کننده محتوا در اندروید را بصورت تصویری در محیط برنامه نویسی Eclipse به شما دانشجویان محترم آموزش دهیم.

 

اهداف پروژه :

در این پروژه ما  قصد داریم اهداف زیر را پیاده سازی نماییم:

دسترسی به تامین کننده محتوا « دفترچه تلفن » 

استخراج تمامی آدرس های پست الکترونیکی ثبت شده کاربران موجود در دفترچه تلفن 

Content Provider  « تامین کننده محتوا » چیست؟ 

تامین کننده محتوا، برای دریافت داده های مورد نیاز برنامه هایمان از پایگاه مرکزی داده اندروید به کار برده می شود. ما می توانیم تامین کننده محتوای دلخواه خود را به منظور دریافت این داده ها از پایگاه داده، کارت حافظه، رسانه ها و ... ایجاد نماییم. وظیفه تامین کننده های محتوا این است که یک لایه انتزاعی بین پایگاه داده اندروید و برنامه های نصب شده در دستگاه اندرویدی که از این داده ها استفاده می کنند ایجاد می نماید و برنامه های نصب شده نیز با استفاده از حل کننده محتوا «Content Resolver »، می توانند روش های تامین کننده محتوا را فراخوانی کنند و به داده های مورد نیاز خود دسترسی پیدا نمایند. تامین کننده محتوا و کلاسی به نام ContentResolver، جهت ایجاد رابطی برای داده ها به منظور مدیریت ارتباطات بین فرایندی و دسترسی ایمن به داده ها به کار برده می شوند. تامین کننده محتوا داده ها را به صورت جدول به ContentResolver نشان می دهد که به عنوان پایگاه داده نسبی دیده می شوند. اندروید مجموعه ای از تامین کننده های محتوا را ارائه می نماید که داده هایی نظیر اطلاعات مخاطبین، اطلاعات تقویم و فایل های رسانه ای را ذخیره می کنند.

 

ContentResolver « روش Client برای دسترسی به تامین کننده محتوا »

یک برنامه، داده ها را با استفاده از ContentResolver از تامین کننده محتوا دریافت می نماید. ContentResolver توابع اولیه نظیر ایجاد، بازخوانی، به روز رسانی و حذف را انجام می دهد. هنگامی که برنامه، ContentResolver را فرا می خواند، روشی هم نام تامین کننده محتوا را نیز فرا می خواند.

مثال:

اگر getContentResolver().query را فرابخوانید، در این صورت روش جست و جو در ContentProvider فراخوانده می شود.

اگر getContentResolver().insert را فرابخوانید، در این صورت روش ایجاد در ContentProvider فراخوانده می شود.

بسیاری از توسعه دهنده ها با فراخوانی دستورات sql آشنایی دارند. بنابراین اندروید نیز روش های ContentResolver را همانند فراخوانی دستورات sql ایجاد نموده است.

 

برای شروع کار ابتدا می بایست یک پروژه جدید در محیط Eclipse ایجاد نماییم. برای این منظور از منوی File زیر منوی New و سپس زیر منوی Android Application Project را انتخاب می نماییم. (شکل 1)

 

image

 

شکل 1

همچنین برای ساده تر شدن و بالا بردن سرعت کار می توانید از منوی ابزار ها، منوی New و سپس Android Aplication Project را انتخاب نمایید. (شکل 2)

image

 

شکل 2

 

با انجام هر دو روش پنجره جدیدی با عنوان New Android Application باز می گردد. (شکل 3)

image

 

شکل 3

در این پنجره قسمت هایی وجود دارد که در زیر به توضیح آنها می پردازیم :

Aplication Name  : در این فیلد می بایست نام برنامه خود را وارد نمایید. توجه داشته باشید که هر مقداری را که در این فیلد وارد نمایید، برنامه با این نام در لیست برنامه های نصب شده قرار خواهد گرفت.

در این فیلد می توانید یک رشته فارسی نیز وارد نمایید.

 

Project Name : در این فیلد می بایست نام کلی پروژه خود را وارد نمایید و بهتر است که یک رشته با معنا و مرطبت با برنامه خود وارد نمایید.

زمانی که مقدار فیلد Aplication Name را وارد می نمایید، فیلد Project Name نیز بصورت خودکار همان نام را وارد می نماید. توجه داشته باشد که اگر فیلد Aplication Name را با یک رشته فارسی مقداردهی نمودید، برای جلوگیری از خطاها می بایست رشته فارسی تولید شده در فیلد Project Name را با یک رشته معادل انگلیسی جایگزین نمایید.

 

Package Name :  در این فیلد می بایست پکیج پروژه خود را تعیین نمایید که بهتر است آدرس وب سایت خود را بدون درج http  و www و بصورت از آخر به اول و به همراه نام وارد شده در فیلد Project Name وارد نمایید. این نوع مقداردهی به برنامه های مارکت نظیر بازار و Google Play این امکان را میدهد تا زمانی که نسخه جدیدی از برنامه شما ساخته و آماده منتشر گردید باخبر شده و نسخه جدید برنامه تان را جایگزین نسخه قبلی نماید.

 

Minimum Required SDK : در این لیست انواع API های « نسخه های سیستم عامل اندروید » منتشر شده توسط گوگل وجود دارد. با انتخاب هر کدام از آنها مشخص می نمایید که برنامه تان به چه حداقل نسخه ای از سیستم عامل اندروید نیاز دارد. برای مثال اگر گزینه API 14 را انتخاب نمایید، برنامه تان در سیستم عامل اندروید پایین تر از اندروید 4 یا همان IceCream Sandwich، نصب و اجرا نمی گردد.

اگر از امکانات خاص نسخه های جدیدتر سیستم عامل اندروید استفاده نمی نمایید پیشنهاد می گردد که API 8  را انتخاب نمایید. چرا که با انتخاب این نسخه از سیستم عامل اندروید مطمئن خواهید بود که برنامه شما در تمامی گوشی ها و تبلت ها اجرا خواهد شد.

 

Target SDK : در این لیست انواع API های « نسخه های سیستم عامل اندروید » منتشر شده توسط گوگل وجود دارد. با انتخاب هر کدام از آنها مشخص می نمایید که بالاترین نسخه اندرویدی که برنامه شما می تواند در آن نصب و اجرا گردد کدام نسخه است. بدیهی ست که هرچه سطح API انتخاب شده بالاتر باشد، گوشی ها و تبلت های جدید نیز می توانند از برنامه شما استفاده نمایند.

 

Compile With : در این لیست انواع API های « نسخه های سیستم عامل اندروید » منتشر شده توسط گوگل وجود دارد. با انتخاب هر کدام از آنها مشخص می نمایید که برنامه Eclipse از کدام نسخه از سیستم عامل اندروید برای نوشتن کلاس های برنامه و همچنین کامپایل و تست نمودن آن استفاده نماید.

 

Theme : در این لیست می توانید یک Theme برای برنامه خود انتخاب نمایید.

توجه داشته باشید زمانی که مقدار Compile With را کمتر از API 14 انتخاب نمایید، از این قسمت نمی توانید استفاده نمایید و می بایست از لیست موجود گزینه None رو انتخاب نمایید.

پس از مقداردهی نمودن فیلد های ذکر شده بر روی دکمه Next کلیک می نماییم تا به مرحله بعدی ایجاد پروژه برویم. (شکل 4)

 

image

 

شکل 4

در مرحله بعدی اگر گزینه Create custom lunche icon را انتخاب نمایید، برنامه Eclipse به شما اجازه میدهد تا برای برنامه خود یک عکس جهت ساختن icon انتخاب و یا با استفاده از ابزار های خود برنامه Eclipse، icon مورد نظر خود را ترسیم نمایید. توجه داشته باشید که در صورت عدم انتخاب این گزینه، صفحه مربوطه برای شما باز نخواهد شد.

همچنین اگر گزینه Create Activity را انتخاب نمایید، برنامه Eclipse به شما اجازه میدهد که نام و نوع activity برنامه تان را انتخاب نمایید.

این دو گزینه را انتخاب می نماییم و سایر گزینه ها را به حالت پیش فرض خود می گذاریم. حال مجددا بروی دکمه Next کلیک می نماییم تا به مرحله بعدی ایجاد پروژه برویم. (شکل 5)

 

image

شکل 5

در مرحله بعدی می توانید برای برنامه خود یک icon انتخاب و یا رسم نمایید.

دکمه image برای انتخاب یک عکس ترجیحا با فرمت png به عنوان icon برنامه

دکمه Clipart برای انتخاب یک clipart « شکلک » به عنوان icon برنامه

دکمه Text برای ورود یک نوشته به عنوان icon برنامه

مورد استفاده قرار می گیرند.

ما دکمه image را انتخاب و پس از انتخاب کردن عکس مورد نظر به عنوان icon برنامه بر روی دکمه Next کلیک می نماییم تا به مرحله بعدی ایجاد پروژه برویم. (شکل 6)

 

image

 

شکل 6

در مرحله بعدی گزینه Create Activity را انتخاب می نماییم و از لیست موجود که بیانگر انتخاب نوع Activity برنامه می باشد گزینه Blank Activity را انتخاب می نماییم. (شکل 7)

 

image

 

شکل 7

در مرحله آخر نیز باید برای activity و layout خود یک نام انتخاب نمایید. ما نام انتخاب شده پیش فرض را قبول کرده و بر روی دکمه Finish کلیک می نماییم تا پروژه مان ساخته شود. (شکل 8)

 

image

 

شکل 8

تا این جای کار ما پروژه خود را در برنامه Eclipse ایجاد کرده ایم. حال برای ادامه کار می بایست layout برنامه خود را طراحی نماییم.

برای این منظور یک TextView بر روی layout خود قرار می دهیم. (شکل 9)

 

image

 

شکل 9

 

همچنین مقدار لازمه برای نمایش عنوان برنامه را در فایل string.xml وارد می نماییم. (شکل 10)

image

 

شکل 10

 

حال در این مرحله می بایست کد های اصلی برنامه را در کلاس MainActivity وارد نماییم.

اولین کدی که می بایست به کلاس MainActivity اضافه نماییم متد onCreate می باشد. این متد یکی از متدهای اصلی برنامه و همین طور چرخه حیات برنامه های اندرویدی می باشد و زمانی که برنامه برای اولین بار اجرا می گردد و یا دستگاه اندرویدی ما از حالت portrait به حالت landscape و یا بر عکس تغییر می کند، این متد فراخوانی می گردد.

یکی از دستورات مهمی که باید به این متد اضافه شود دستور setContentView است. وظیفه این دستور به نمایش در آوردن layout برنامه می باشد.(شکل 11)

image

 

شکل  11

مقدار activity_main نام فایل xml مربوط به layout برنامه مان می باشد.

همچنین دستور savedInstanceState حالت جاری layout برنامه را ذخیره می نماید. به این معنا که، فرض نمایید بر روی layout خود یک ابزار EditText قرار داده اید و مقدار نام خودتان را درون آن وارد کرده اید. زمانی که حالت دستگاه اندرویدی خودتون را به landscape و یا portrait تغییر دهید مشاهده می نمایید که مقدار نام شما هنوز در EditText وجود دارد و پاک نشده است. دلیل آن به خاطر استفاده از دستور فوق می باشد.

در مرحله بعدی می بایست کدهایی بنویسیم تا بوسیله ی آنها بتوانیم به ابزار TextView خود دسترسی پیدا نماییم. (شکل 12)

image

 

شکل 12

حال که دسترسی لازم را ایجاد نموده ایم، در مرحله بعد می بایست دستورات مربوط به خواندن آدرس های پست الکترونیک کاربران را وارد نماییم. (شکل 13)

 

image

 

شکل  13

کدهای بالا را در ادامه کدهای وارد شده قبلی در متد onCreate قرار میدهیم.

 

در کد بالا، عملیات خواندن آدرس های پست الکترونیک کاربران را با استفاده از تابع getEmailContact انجام داده ایم و اطلاعات بدست آمده را در متغیر emailStr که از نوع String می باشد، ذخیره نموده ایم. در انتها نیز مقدار متغیر emailStr را با استفاده از متد setText، در ابزار TextView نمایش می دهیم.

در ادامه کار نیز کدهای مربوط به تابع getEmailContact را وارد می نماییم. (شکل 14)

 

image

 

شکل 14

در تابع بالا، ابتدا یک متغیر به نام emaildata از نوع String تعریف نموده ایم. این متغیر در ادامه کار برای ذخیره کردن آدرس های پست الکترونیک کاربران بدست آمده مورد استفاده قرار خواهد گرفت.

در خط بعدی از بلاک try/catch استفاده می نماییم تا بتوانیم خطاهای احتمالی را هندل نماییم. در اولین خط بلاک try یک شی با نام cr از کلاس ContentResolver تعریف نموده ایم و ادامه با استفاده از دستور getBaseContext().getContentResolver()، شی مذکور را می سازیم.

این شی برای ایجاد کوئری های مورد نیاز برای دریافت آدرس های پست های الکترونیکی موجود در لیست مخاطبان مورد استفاده قرا می گیرد.

در خط بعدی یک شی با نام cur از کلاس Cursor تعریف می نماییم و در ادامه با استفاده از دستور cr.query شی مذکور را می سازیم. با استفاده از این دستور تمامی اطلاعات موجود مخاطبان را انتخاب کرده و بصورت یک جدول در شی cur ذخیره می کنیم.

خروجی دستور cr.query و یا هر کوئری دیگری که استفاده نماییم، یک شی از کلاس Cursor می باشد. بدین جهت می بایست خروجی این دستور را در یک شی از کلاس Cursor ذخیره نماییم.

دستور cr.query، پنج پارامتر ورودی دریافت می کند که در ادامه به توضیح آنها می پردازیم:

پارامتر اول: این پارامتر، شئی از کلاس URI می باشد که داده ها را در تامین کننده محتوا تشخیص می دهد. این شی شامل نام نمادین تامین کننده محتوا و نامی می باشد که به جدول اشاره دارد و به طور پیش فرض از دستور ContactsContract.Contacts.CONTENT_URI استفاده می شود.

پارامتر دوم: این پارامتر، متغیر آرایه ای از نوع String می باشد و تعیین کننده ستونی از داده هایی می باشد که ما می خواهیم از جدول فراخوانی گردد.

پارامتر سوم: این پارامتر، متغیری از نوع String می باشد و معیار انتخاب ردیف جدول می باشد.  همانند دستور where در sql می باشد.

پارامتر چهارم: این پارامتر، متغیر آرایه ای از نوع String می باشد و توسط کاربر تعریف می گردد و جایگزین علامت ؟ موجود در پارامتر سوم « در صورت استفاده از این علامت در پارامتر دوم » می گردد.

پارامتر پنجم: این پارامتر، متغیری از نوع String می باشد و ترتیبی که ردیف ها باید در شی cur ظاهر شوند را نشان می دهد. این دستور همانند ORDER BY در SQL می باشد.

 

در خط بعدی با استفاده از دستور شرطی if چک می نماییم که آیا اطلاعات مخاطبی در دستگاه اندرویدی وجود داشته است یا خیر « شماره تلفنی در دفترچه تلفن دستگاه اندرودی ذخیره شده است یا خیر »؟ اگر شرط برقرار باشد وارد بدنه دستور شرطی if می شویم و در غیر این صورت بدنه دستور else اجرا می شود و پیغام  اطلاعاتی پیدا نشد   را در متغیر emaildata قرار میدهیم و با استفاده از دستور return از تابع خارج می شویم و پیغام برگشت داده شده از تابع را به کاربر نمایش میدهیم.

حال اگر دستور شرطی if برقرار باشد، با استفاده از حلقه while و دستور cur.moveToNext، چک می نماییم که به انتهای شی cur نرسیده باشیم و تا زمانی که به انتهای شی فوق الذکر نرسیده باشیم، دستورات داخل حلقه while اجرا خواهند شد.

همان طور که در بالا ذکر شده است، شی cur حاوی یک جدول از اطلاعات مخاطبان موجود در دستگاه اندرویدی می باشد و همان طور که می دانید هر جدول حاوی یک سری سطر و ستون می باشد. یکی از این ستون ها، _ID نام دارد. با استفاده از دستور ی که در خط بعدی آن آورده شده است، مقدارهای این ستون را خوانده و در متغیری به نام contactId که از نوع String می باشد، ذخیره می نماییم. در خط بعدی مجددا شی از کلاس Cursor و به نام emails ایجاد کرده ایم و با استفاده از دستور مقابل آن، تمامی مخاطبانی که دارای آدرس پست الکترونیکی هستند را انتخاب کرده و درون آن ذخیره نموده ایم.

در ادامه با استفاده از حلقه while و دستور emails.moveToNext چک می نماییم که به انتهای شی emails نرسیده باشیم و در داخل بدنه این حلقه با استفا ه از دستوری که در اولین خط حلقه while نوشته شده است، تنها مقادیر فیلد آدرس پست الکترونیک را خوانده و در متغیر emaildata ذخیره می نماییم و بعد از حلقه، شی emails را می بندیم « از بین می بریم ».

اگر بخواهیم ایمیل مخاطب را دریافت نماییم می بایست از CommonDataKinds.Email استفاده نماییم.

بعد از دستور شرطی if، شی cur را نیز می بندیم « از بین می بریم » و در آخر با استفاده از دستور return از تابع خارج شده و مقدار متغیر emaildata را که حاوی آدرس های پست الکترونیک موجود در لیست مخاطبان می باشد را باز می گردانیم.

اگر بلاک try به هر دلیلی اجرا نگردد و یا در حین اجرا به خطای از پیش کنترل نشده ای برخورد نماییم،  دستورات موجود در قسمت catch اجرا می گردد. در این قسمت نیز متن خطای تولید شده را در متغیر emaildata ذخیره می نماییم.

 

در انتها نیز برای آنکه بتوانید از برنامه استفاده نماییم و به لیست مخاطبان جهت دریافت آدرس های پست الکترونیک کاربران دسترسی داشته باشیم، می بایست یک permission به فایل AndroidManifest.xml اضافه نماییدم. (شکل 15)

 

 

image

 

 

در اینجا کار ما به اتمام میرسد. امیدواریم نهایت استفاده از این مقاله را برده باشید.

شاد و پیروز باشید.

 

1394/07/27 9677 606
رمز عبور : tahlildadeh.com یا www.tahlildade.com
نظرات شما

نظرات خود را ثبت کنید...