Professional Documents
Culture Documents
بناء ي ات الأبدروبد
ق
يف نظم املعلومات اجلغرافية
(اجلزء األول)
2022/ 2021
بناء تطبيقات األندر ويد
اجلزء األول
2022 - 2021
بسم هللا الرحمن الرحيم
بسم اهلل الرمحن الرحيم والصالة والسالم على أشرف اخللق سيدنا ونبينا حممد صل اهلل عليه وسلم أما بعد؛ جاء هذا الكتاب " بناء
تطبيقات األندرويد يف نظم املعلومات اجلغرافية ؛ ليوضح األساسيات اليت جيب معرفتها عند بناء تطبيقات األندرويد واليت تستخدم
كتطبيقات لنظم املعلومات اجلغرافية ؛ فتزايد استخدامات األندرويد وانتشاره مع العامة ؛ مع أمهيته ومرونته يف التعامل ؛ ظهرت
تطبيقات األندرويد واملتخصصة يف نظم املعلومات اجلغرافية ؛ سواء تطبيقات خاصة جبمع البيانات من امليدان ؛ أو التطبيقات اخلاصة
بتحليل البيانات ؛ أو التطبيقات اخلاصة بالتنبؤ باألحوال اجلوية وحالة الطقس ؛ والعديد من التطبيقات األخرى .
وللتطرق اىل كيفية بناء تطبيقات األندرويد بصفة عامة والتطبيقات املتخصصة يف نظم املعلومات اجلغرافية بصفة خاصة جيب معرفة
بعض األساسيات ولذا جاء الباب األول من الكتاب بأساسيات لغة اجلافا؛ وهى اللغة اليت نستخدمها فى التطبيقات باألبواب التالية من
الكتاب ؛ والباب الثاني شرح كيفية التعامل مع األندرويد أستوديو وكيفية ضبط إعدادات التطبيق اخلاص بى وكيفية اختيار
الشكل املناسب له " باستخدام لغة اجلافا" ؛ والباب الثالث واألخري عن تطبيقات األندرويد فى نظم املعلومات اجلغرافية ؛ فى البداية
نعرض كيفية استخدام خرائط جوجل ؛ ثم استخدام خرائط open Street map؛ ثم انشاءتطبيقات االندرويد
باستخدام ArcGIS Runtime SDKواخريا انشاء تطبيق للحصول على بيانات الطقس .
رشا نوفل
فهرس الموضوعات
ب إهداء.
مقدمة:
لقد غيرت تكنولوجيا الهواتف المحمولة بشكل كبير طريقة تواصلنا وتفاعلنا مع العالم الخارجي؛ فمع زيادة
استخدام الهواتف المحمولة وتقدم تقنيات معلومات اتصاالت المعلومات ،ظهرت نظم المعلومات الجغرافية
المتنقلة لتوفير جمع البيانات في الوقت الحقيقي وتحديثها ،وجعلت الوصول إلى نظم المعلومات الجغرافية
أسرع وأكثر سهولة ؛ فاندماج نظم المعلومات الجغرافية مع الهواتف المحمولة قامت على توسيع عمليات جمع
البيانات وتحليلها ؛ حيث أصبح الميدانيين لديهم القدرة على جمع البيانات المكانية وتخزينها وتحريرها ومعالجتها
وبمعنى أخر أن تطبيقات الهواتف الذكية المحمولة فى نظم المعلومات الجغرافية تساعدنا على الوصول الى
قواعد البيانات في أي وقت وأي مكان ؛ والفكرة تكون فى أن النظام يكون متوفر على ويب والبيانات موجودة
على SERVER؛ والمستخدمين قادرين على الوصول الى البيانات والنظام بأكمله من خالل هواتفهم .
وفى هذا الكتاب نوضح كيفية الدخول الى عالم برمجة تطبيقات األندرويد المتعلقة بنظم المعلومات
الجغرافية.
1
الباب الأول
مقدمة:
البرمجة :هي عملية كتابة تعليمات وأوامر محددة نخبر به الحاسوب بما يجب تنفيذه؛ وهي أداتنا الوحيدة
لتحويل المتطلبات البشرية الى برامج حاسوبية.
وجهاز الحاسب األلى؛ عبارة عن جهاز الكتر ونى يفهم قيمتين فقط هما تيار كهربائي يمر وتيار كهربائي ال
يمر وهو ما يسمى في الفيزياء ("دائرة مفتوحة ودائرة مغلقة ")؛ هذا التسلسل ينتج منه بيانات هذه البيانات حتى
يتم معالجتها بالحاسب األلى يتم تمثيلها بشكل ثنائي (صفر؛ واحد) ويسمى بالنظام الثنائي " .binary System
وهذا يشكل صعوبة عند طلب تنفيذ األوامر من الحاسوب فال يستطيع العنصر البشرى ترجمة األمر الى
( )0,1لذلك يأتي دور لغات البرمجة.
لغات البرمجة:
اللغة بصفة عامة هي وسيلة للتعبير عن األفكار وتسجيلها؛ وهناك لغات من حولنا ال تطلب التحدث مثل لغة
الجسد فهي قادرة على التعبير عن مشاعرنا دون قول كلمة واحدة.
ويستخدم األشخاص عدد من اللغات المختلفة والتي تتطور كل يوم حيث تظهر كلمات جديدة وتختفي الكلمات
القديمة ،وتسمى هذه اللغة باللغات الطبيعية.
فأجهزة الكمبيوتر تحتاج إلى لغة وتسمى هذه اللغة بلغة اآللة وتعتبر هذه اللغة لغة بدائية فجميع أجهزة
الكمبيوتر حتى المعقد منها للغاية من الناحية التقنية تخلو من الذكاء؛ فيمكن وصف الكمبيوتر بالكلب المدرب
تدريب عالي فهو يستجيب فقط لألوامر؛ وتسمى قائمة األوامر بالـ ILأو .ILS
فلغة البرمجة هي اللغات الوسيطة بين االنسان والحاسب األلى وهى اللغة التي يفهمها الحاسب االلى ؛
وهناك لغات البرمجة المنخفضة المستوى واللغات العالية المصدر مثل لغة الجافا.
طرق التحويل من لغة برمجة عالية المصدر إلى لغة اآللة -:
التحويل البرمجى :حيث يتم ترجمة البرنامج المصدر مرة واحدة وبذلك يتم تكرار هذا اإلجراء فى كل مرة نقوم
فيها بالتعديل على التعليمات البرمجية.
ترجمة :حيث يتم ترجمة البرنامج فى كل مرة يتم تشغيله ؛ ويطلق على البرنامج الذى يقوم بهذا األداء "
مترجماً" حيث يفسر الشفرة فى كل مرة يعتزم فيها تشغيل البرنامج.
3
د /رشا صابر نوفل مقدمة الباب األول :أساسيات لغة اجلافا
المترجم نوعيين:
:Interpreterحيث يتم إدخال الكود اليه ويخرجه فى صورة يفهمها الجهاز " الـ out put؛ يحدد الخطأ
ومكانه بمجرد الحصول علي خطأ يتوقف حتي اصالح الخطأ.
:Compilerيأخذ الكود ويحوله إلى Object codeثم إلى Executorثم المخرج النهائي ؛ هذا المترجم
يقوم بإظهار الخطأ ويكمل عملية الترجمة ؛ ويظهر الخطأ مجمع.
جاء هذا الباب ليشرح أساسيات هذه اللغة من خالل سبعة فصول بداية من معرفة كيفية انشاء ملف جافا؛
المتغيرات؛ العوامل ؛ الشروط ؛ الحلقات التك اررية ؛ الدوال ؛المصفوفات ؛ Classو . object
4
د /رشا صابر نوفل ماهية لغة اجلافا الفصل األول
الجافا :Javaهي لغة برمجة عالية المستوى ابتكرها James Goslingفي عام 1991أثناء عمله في
مختبرات شركة Sun Microsystemsوذلك الستخدامها بمثابة العقل المفكر المستخدم لتشغيل األجهزة
الذكية.
عام 1995تم تطويرها لبناء تطبيقات للويب؛ السيرفرات؛ سطح المكتب؛ الهواتف والروبوتات.
https://harmash.com/java/java-environment-setup/
-لغة قوية حيث يمكن من خاللها برمجة تطبيقات قوية وخالية من األخطاء مع وجود ميزة تعديل األخطاء
أثناء البرمجة.
-متعددة االستخدامات.
5
د /رشا صابر نوفل ماهية لغة اجلافا الفصل األول
-يمكن تنفيذ تطبيق يعمل على أكثر من األنظمة مثل Android ,Unix ,Linux ,OS Mac ,Windows
إلخ.
-التطبيقات والبرامج المكتوبة بلغة الجافا تعمل بشكل سريع ألن معالجة الجافا سريعة.
يتم حفظ ملف الجافا بامتداد دوت جافا ويقوم الـ Compilerبتحويل الملف الى Byte codeثم يقوم JVM
؛ بالتحويل الى أوامر يفهماه نظام التشغيل لتنفيذ األوامر المطلوبة .
: JREاختصار لـ Java Runtime Environment؛ ( بيئة تشغيل الجافا) والتي تتيح تشغيل برامج
الجافا على نظام التشغيل ؛ وهى تحتوى على .JVM
: JDKاختصار لـ Java Development Kit؛ حزمة تطوير الجافا التي يستخدمها المطور لتطوير
برامج بلغة الجافا والتي تحتوى على . JRE
6
د /رشا صابر نوفل ماهية لغة اجلافا الفصل األول
7
د /رشا صابر نوفل ماهية لغة اجلافا الفصل األول
نفتح الـ Visual Studio Codeنقوم بعمل ملف جديد يتم حفظ الملف بامتداد ) ) .java؛
0
8
د /رشا صابر نوفل ماهية لغة اجلافا الفصل األول
-كتابة class؛ واختيار من القائمة المنسدلة ( مراعاة كتابة األحرف صغيرة)؛ ووضع اسم للـ class
"يفضل تسمية اسم الـ Classاألساسى بنفس اسم مجلد الجافا النه قد يعطى خطأ "
-كتابة األمر main
-كتابة األمر Systemمع مراعاة الحرف األول كبير؛ ثم outثم printInووضع الكلمة المراد
طباعتها.
- ;)"System.out.println("Rasha_Nofal
9
د /رشا صابر نوفل ماهية لغة اجلافا الفصل األول
ملحوظة :ال يدعم الجافا طباعة األحرف العربية؛ فإذا تم كتابة الحروف بالعربية للطباعة تظهر على
شكل حروف غير مرتبة على النحو التالي؛
10
د /رشا صابر نوفل ماهية لغة اجلافا الفصل األول
من Debugger for Java؛ ومن ترس االعدادات؛ نختار Extensions Settings
11
د /رشا صابر نوفل ماهية لغة اجلافا الفصل األول
بعد ذلك عند عمل Run؛ تظهر الطباعة في جزء CONSOLEكما موضح أدناه؛
12
د /رشا صابر نوفل ماهية لغة اجلافا الفصل األول
*/
هنا يتم كتابة التعليقات
فى أكثر من سطر
*/
انشاء الـ Classداخل الجافا:
معنى :classهي عبارة عن اسم يحمل مجموعة من الخصائص؛ ويمكن تعريفها بانها حاوية كبيرة تحتوى
على الكود كله " متغيرات – دوال ....الخ .
كتابة class؛ ثم اختيار اسم له مع االخذ في االعتبار ما يلى:
-ال يوجد مسافات عند كتابة االسم.
-ال يمكن استخدام الرموز واألشكال.
-ال يمكن أن يبدأ االسم برقم.
-يفضل ان يكون اسم بنفس اسم ملف الجافا الذي تم إنشاؤه.
13
د /رشا صابر نوفل ماهية لغة اجلافا الفصل األول
بعد ذلك يتم انشاء methodداخل الكالس ؛ وليكن main؛ وداخل عنصر هذا ال methodيتم كتابة األوامر
المطلوب تنفيذها ويتم تنفيذها بمجرد الضغط على Run؛ بينما Debugفتعنى إيجاد األخطاء.
لعرض البيانات بالجافا يتم عن طريق عنصر ) ( System.out.printInوداخل األقواس يتم كتابة
البيانات المراد طباعتها على حسب نوعها فلو بيانات نصية يتم وضعها داخل " " .
ويتم حل هذا الخطأ من قائمة file؛ ثم اختيار open folder؛ واختيار ملف الجافا المستخدم ؛ ثم
select folder؛ ثم اختيار
14
د /رشا صابر نوفل ماهية لغة اجلافا الفصل األول
15
د /رشا صابر نوفل املتغريات يف لغة اجلافا الفصل الثاني
16
د /رشا صابر نوفل املتغريات يف لغة اجلافا الفصل الثاني
" Stringمع مراعاة حرف Sمن األحرف الكبيرة " ثم كتابة اسم المتغير ثم كتابة قيمة المتغير داخل " ثم
انهاء السطر بـ ;
يتم عرض البيانات عن طريق عنصر System؛ وذلك على النحو الموضح؛
ولطباعة قيمة المتغير مع وجود األقواس " " يتم ذلك عن طريق "\" اسم المتغير\"" ؛ كما موضح
17
د /رشا صابر نوفل املتغريات يف لغة اجلافا الفصل الثاني
وإلضافة النص فى سطر جديد يتم ذلك عن طريق كتابة \n؛ حرف الـ nاختصار لـ new line
18
د /رشا صابر نوفل املتغريات يف لغة اجلافا الفصل الثاني
ملحوظة :عدد األحرف فى النص 10؛ وتم كتابة العدد 11وذلك ألن الجافا تحسب المسافة .
تستخدم : indexofلمعرفة مكان حرف معين أو كلمة محددة داخل ملف الجافا؛ حيث يتم عرض المكان
بالرقم ( الحرف رقم 6مثال) ؛ مع األخذ فى االعتبار أنه إذا تكرر الحرف فى أكثر من موقع يتم ذكر مكان
أول تمركز ألول حرف يقابله.
19
د /رشا صابر نوفل املتغريات يف لغة اجلافا الفصل الثاني
20
د /رشا صابر نوفل املتغريات يف لغة اجلافا الفصل الثاني
المتغيرات الرقمية:
-بايت : byteيستخدم لألرقام الصغيرة ( ) bits 8؛ ( األرقام 2مع القوة 2 " 7أس )" 7؛ أي
ان أصغر عدد يتم تخزينه يكون ( 127؛ .) 127-
: Short -وتكون (. ) bits 16
: Int -ويكون (( .) bits 32أي الرقم 2مع القوة )"2^31 " 31أي أكبر عدد يتم تخزينه هو
.2147483648
: Long -يكون (.)bits 64
-يتم تحديد نوع المتغير الرقمى أوال " أي نوع من األنواع السابقة"
-يتم كتابة اسم المتغير .
-يتم تحديد قيمة المتغير .
21
د /رشا صابر نوفل املتغريات يف لغة اجلافا الفصل الثاني
-تستخدم لتخزين الرموز واألشكال الخاصة أو لتخزين رقم واحد أو حرف واحد وحتى األشكال
والرموز رمز واحد فقط.
-تكتب فى الجافا . char
22
د /رشا صابر نوفل املتغريات يف لغة اجلافا الفصل الثاني
23
د /رشا صابر نوفل العوامل والشروط يف لغة اجلافا الفصل الثالث
تستخدم - -لطرح رقم من الناتج ؛ + +إلضافة رقم للناتج ؛ تكتب كما موضح
;int y = 12
;y--
أو ;--y
;++y
أو ;y++
;)System.out.println( y
}
}
24
د /رشا صابر نوفل العوامل والشروط يف لغة اجلافا الفصل الثالث
25
د /رشا صابر نوفل العوامل والشروط يف لغة اجلافا الفصل الثالث
https://harmash.com/java/java-operators/ المصدر:
https://harmash.com/java/java-operators/ المصدر:
26
د /رشا صابر نوفل العوامل والشروط يف لغة اجلافا الفصل الثالث
الشرط هو وضع قيود محددة لتنفيذ الكود؛ فلو الشرط صحيح يتم تنفيذ الكود؛ ولو الشرط خطأ لم يتم تنفيذه؛
وتستخدم الشروط لتحديد طريقة عمل البرنامج؛
معناها إذا كان الشرط صحيح نفذ الكود ؛ وإذا كان الشرط خطأ نفذ كود أخر؛ وتكتب كما يلى
{) ( if
}
{else
}
وإذا أردنا كتابة شرطان داخل الجملة الشرطية يتم إضافة else if
{) ( if
}
{)(else if
}
{else
}
}
}
27
د /رشا صابر نوفل العوامل والشروط يف لغة اجلافا الفصل الثالث
28
د /رشا صابر نوفل العوامل والشروط يف لغة اجلافا الفصل الثالث
&& : andتستخدم الضافة أكثر من شرط داخل ifالواحدة ؛ وينبغى تنفيذ الشرطين الموجودين داخل
الجملة الشرطية .
29
د /رشا صابر نوفل العوامل والشروط يف لغة اجلافا الفصل الثالث
|| : orتستخدم في حالة اذا أردنا أحد الشرطين فقط صحيحة .
! : notووضعها يعنى أنه فى حالة تحقق الشرط لن يتم التنفيذ ؛ واذا لم يتحقق الشرط يتم التنفيذ؛
30
د /رشا صابر نوفل احللقات التكرارية يف اجلافا الفصل الرابع
نستخدم الحلقات ( ) Loopsبهدف تكرار نفس الكود عدة مرات ؛ أي أن أي كود نريده أن يتنفذ عدة مرات
نقوم بكتابته داخل حلقة فتقوم هي بإعادة تنفيذ الكود قدر ما شئنا ضمن شروط معينة نقوم نحن بتحديدها.
: For Loopستخدم الحلقة forفي حال كان عدد المرات التي سيعاد فيها تنفيذ الكود معروفا ؛ ويتم
كتابته كما يلى ؛
31
د /رشا صابر نوفل احللقات التكرارية يف اجلافا الفصل الرابع
:While Loopيفضل استخدام الحلقة whileفي حال كان عدد المرات التي سيعاد فيها تنفيذ الكود غير
معروف.
: Do While Loopيفضل استخدام الحلقة do whileفي حال كان عدد المرات التي سيعاد فيها تنفيذ
الكود غير معروف و بنفس الوقت يجب أن يتنفذ مرة واحدة على األقل
وفى هذه الحالة يتم تنفيذ الشرط داخل الـ doأوال ثم يتحقق من الشرط في while؛ وتكتب كما يلى؛
32
د /رشا صابر نوفل احللقات التكرارية يف اجلافا الفصل الرابع
33
د /رشا صابر نوفل احللقات التكرارية يف اجلافا الفصل الرابع
تستخدم continueمع الحلقات فقط " "loops؛ حيث نستخدمها لتجاوز تنفيذ كود معين في الحلقة.
الجملة :switch
switchنستخدمها إذا كنا نريد اختبار قيمة متغير معين مع الئحة من االحتماالت نقوم نحن بوضعها ,و إذا
تساوت هذه القيمة مع أي احتمال وضعناه ستتنفذ األوامر التي وضعناها في هذا االحتمال فقط.
كل احتمال نضعه يسمى .caseتكتب كما موضح :
34
د /رشا صابر نوفل احللقات التكرارية يف اجلافا الفصل الرابع
ملحوظة :لسنا بحاجة لوضع breakللحالة األخيرة ألن البرنامج سيخرج من الجملة switchفي جميع
األحوال.
في حالة أن نريد طباعة جملة في حالة عدم تطابق المتغير مع جميع الحاالت التي تم احتمالها ؛ يتم ذلك
عن طريق األمر default؛
35
د /رشا صابر نوفل احللقات التكرارية يف اجلافا الفصل الرابع
مثال أخر:
36
د /رشا صابر نوفل املصفوفات يف لغة اجلافا الفصل اخلامس
المصفوفة :عبارة عن كائن يحتوي على مجموعة عناصر من نفس النوع يتم تخزينها بجوار بعضها في
الذاكرة؛ بمعنى آخر المصفوفة عبارة عن كائن يمكنه تخزين عدة قيم من نفس النوع.
يتم التمييز بين عناصر المصفوفة من خالل رقم محدد يعطى لكل عنصر يسمى بالـ index؛ أول عنصر
فيها يتم تخزينه في الـ indexرقم .0
ملحوظة :عدد عناصر المصفوفة ثابت؛ أي أنه بمجرد تحديده ال يمكننا تغييره ؛ لكن يمكن تغيير قيم هذه
العناصر في أي وقت.
-يسهل تطوير الكود فإذا قمنا بتخزين المعلومات داخل مصفوفة نستطيع تعديلهم و مقارنتهم أو
استدعاؤهم مرة واحدة بكود صغير جداً باستخدام الحلقات.
37
د /رشا صابر نوفل املصفوفات يف لغة اجلافا الفصل اخلامس
لكن إذا كانت البيانات يتم تنفيذها على طالب الجامعة كلهم فتصبح هذه الطريقة صعبة التنفيذ لذلك يتم
كتابة المصفوفة عن طريق الـ loopوتنفذ بهذه الطريقة ؛
ملحوظة :إذا لم يتم عمل البرامج ويظهر خطأ على الرغم من الكتابة الصحيحة لألكواد ؛ إذن فيحتاج
البرنامج الى استدعاء مكتبة الـ Array؛ ويتم استدعاؤها كما يلى
38
د /رشا صابر نوفل املصفوفات يف لغة اجلافا الفصل اخلامس
;import java.util.Arrays
For eachفى الجافا :
تستخدم لعرض بيانات الـ Array؛ فى المثال التالى ؛ تم تعريف متغير من نوع النصى وتم تسميته ؛
Arc_GISوتم وضع عناصره داخل مصفوفة ؛وتم وضع متغير ثاى داخل الـ forمع مراعاة أنه يجب أن
يكون من نفس النوع " نصى" ؛ وتم تسميته Geography؛ وطلبنا عرض البيانات الموجودة داخل هذا
المتغير الثانى Geography؛ فنجده يشتق بيانات المتغير Arc_GISكما موضح .
39
د /رشا صابر نوفل الدوال يف لغة اجلافا الفصل السادس
40
د /رشا صابر نوفل الدوال يف لغة اجلافا الفصل السادس
يستخدم عندما نريد إعادة البيانات عند التشغيل ؛ لذا يتطلب تحديد نوع البيانات قبل كتابة method
41
د /رشا صابر نوفل الدوال يف لغة اجلافا الفصل السادس
يستخدم objectالـ Local dataفى لغة الجافا لتحديد السنة والشهر واليوم ؛ الستخدام Local data؛
يتم كتابتها داخل الكالس ؛ نجد تلقائيا تم استيرادها ؛ ثم إعطائها اسم " تم تسميتها Local data؛ وذلك
على النحو الموضح ؛
42
د /رشا صابر نوفل الدوال يف لغة اجلافا الفصل السادس
وداخل الـ catch؛ يتم كتابة ) (Exception errorوتعنى باستثناء ؛ وفائدتها انه فى حالة كتابة أوامر
خطأ يتم تنفيذ األوامر المتبقية دون تعطيل البرنامج ويستثنى األوامر الخاطئة .
ثم نكتب األمر finallyوداخله يتم كتابة األوامر المراد تنفيذها فى حالة وجود خطأ فى األوامر الموجودة
داخل الـ catch
وللتوضيح أكثر تم وضع خطأ فى الـ tryحيث تم طلب طباعة cars 6وطول البيانات 3فقط ؛ ونضع فى
الـ catchاالمر المراد طباعته اذا وجد خطأ ؛ كما يتضح
43
د /رشا صابر نوفل الكائن والكالس يف اجلافا الفصل السابع
: Classيمكن تعريف Classبمنتهى البساطة بأنها هى عبارة عن حاوية أو حقيبة يتم فيها جمع الدوال
والقيم الخاصة بالبيانات أيا كان نوعها .
Object:كل شيء في البرنامج الخاص بنا عبارة عن Objectوله نوع محدد ؛ و Objectهو نسخة
Copyمن classالخاصة بنا .
حيث أن المبرمجين أثناء تنفيذهم للغة تخيلوا أن المستخدم يمكنه التعامل مع أنواع متعددة من البيانات ؛ فقد
تكون أرقام أو حروف ( ) Stringأو الدمج بينهم ولتعدد هذه البيانات تم عمل حقيبة لتحوى هذه البيانات
وتسمي class؛ وكل حقيبة ال بد وأن تتناسب مع البيانات التي تحويها .
ويمكن الشرح بمثال هناك شركة سيارات تقوم بعمل تصميم للسيارة التي تنتجها وهذا التصميم يتم تطبيقه
باختالف األلوان ويمكن تطويره أيضاً ؛ فالتصميم األساسي للسيارة هو الـ class؛ والسيارات المختلفة المنتجة
من هذا التصميم تسمى Object؛ فهناك Object1و Object 2إلخ.
Actionsهى دوال مثلها مثل أى دوال لكنها بتوضع فى classولذلك تسمى Actions؛ وأى Actions
يعتبر Attribute؛ ولكن Attributeال يعتبر Actionsالن Actionsيكون فيها فعل actionمثل فتح
الباب ؛ زيادة اإلضاءة و الـ Attributeليس بها فعل فهى مجرد خاصية .
Attributeوتعرف أيضا بالـ propertiesهى مجرد قيمة أو خاصية توضع للـ objectأو النسخة الخاصة
بي .
يمكن تنفيذ ذلك فى ملف الجافا وذلك على النحو التالي :
يتم انشاء ملفين جافا؛ ملف نسميه GIS_programes؛ وملف أخر نسميه programs_data؛
داخل ملف GIS_programesنقوم بإنشاء الـ classاألساسى " يفضل تسميته بنفس اسم الملف كما
سبق وأن ذكرنا " ؛ فيتم تسميته GIS_programes
44
د /رشا صابر نوفل الكائن والكالس يف اجلافا الفصل السابع
وفى الملف الثانى programs_dataنقوم بعمل classنقوم بانشاء متغيرات داخل الـ class؛ لتحتوى
على البيانات المراد اضافتها فى بيانات البرامج ؛ كاسم البرنامج ؛ تاريخ إصداره ؛ إمكانيات البرنامج؛ الخ ؛
للوصول الى بيانات هذا الملف من الملف األساسى يتم ذلك عن طريق إنشاء objectباسم الـ " class
" program_dataوإعطاءه اسم متغير وليكن program 1؛ ثم نكتب األمر newونحدد اسم األوبجيكت
مرة أخرى ؛
45
د /رشا صابر نوفل الكائن والكالس يف اجلافا الفصل السابع
؛ كل كما علينا بعد ذلك كتابة المتغير program 1دوت واستيراد البيانات المرادة من الملف األخر كما
موضح ؛
46
د /رشا صابر نوفل الكائن والكالس يف اجلافا الفصل السابع
47
الباب الباني
تعلم برمجة الأندر وند باستجدام الأندروند استود وت
د /رشا صابر نوفل مقدمة الباب الثاني :تعلم برجمة األندر ويد باستخدام األندرويد أستوديو
مقدمة:
االندرويد استوديو هو نظام مجانى لتطبيقات االندوريود (برنامج يتم من خالله كتابه برمجيات) ،من قبل
شركة جوجل؛ هذه البيئة توفر لك مجموعه من المكتبات والتصاميم الجاهزة لعمل تطبيقات مخصصه تعمل
على نظام االندرويد يمتاز بسهولة االستخدام؛ المرونة؛ األكواد مختصرة ؛ يوفر unit testing؛ والتي تقوم
بفحص األكواد .
قبل االندرويد استوديو كان يتم برمجة تطبيقات األندرويد على بيئة تسمى باكليبس (Eclipse) ،؛ولكنها
كانت بيئة مجهده بعض الشيء ،وكل خطوة كانت تحتاج انشاء التصاميم الخاصة بها ؛ بخالف بيئة اندرويد
التي توفر كميه كبيره من التصاميم الجاهزة .
مميزات نظام االندرويد:
-سهولة نشر التطبيق الخاص بك من خالل الجوجل ستور "متجر اندوريود" أو متجر األمازون.
-بيئة التطوير مجانية.
-الربح من التطبيقات.
وفيما يلى يتم عرض كيفية التعامل مع األندرويد استوديو وذلك فى ستة فصول بداية من تحميل النظام
والمتغيرات وتغيير خلفية التطبيق الخاص بى و كيفية عرض العناصر وتغيير خصائصها ومعرفة كيف يمكن
عمل تطبيق بواجهات متعددة ؛ وكيف يمكننا تحويل تطبيق ويب إلى تطبيق أندرويد واالنتهاء حتى يتم حفظ
الملف الخاص بنا واستخراج المشروع بملف APK.
وللتطرق لموضوع بناء تطبيقات أندرويد فى نظم المعلومات الجغرافية ال بد من معرفة أساسيات الجافا ؛ ثم
بعد ذلك التعرف على كيفية استخدام األندرويد استوديو إلنشاء التطبيقات بصفة عامة؛ ثم بعد ذلك تطبيق
هذه العناصر على تطبيقات فى نظم المعلومات الجغرافية.
49
د /رشا صابر نوفل هتيئة العمل باألندر ويد استوديو الفصل الثامن
50
د /رشا صابر نوفل هتيئة العمل باألندر ويد استوديو الفصل الثامن
نضع اسم التطبيق؛ ثم الدومين " نقوم بعمل دومين خاص بنا" my anoroid.com
51
د /رشا صابر نوفل هتيئة العمل باألندر ويد استوديو الفصل الثامن
ثم تفتح النافذة التالية ؛ نتأكد أن هناك نسخة واحدة على األقل محددة.
52
د /رشا صابر نوفل هتيئة العمل باألندر ويد استوديو الفصل الثامن
مجلد manifestsويحتوى على ملف يسمى : Android mainfestesحيث تحتوى على نافذة مضاف
اليها أكواد تلقائيا ؛ ويمكن إضافة الصالحيات التي ترغبها من المستخدم عند استخدام التطبيق الخاص بك؛
مثل استخدام االنترنت؛ الوصول الى الصور والفيديو.
53
د /رشا صابر نوفل هتيئة العمل باألندر ويد استوديو الفصل الثامن
المجلد األول والثانى com.codershiyar :و هى مجلدات تجريبية يوجد بداخله ملف main activity
حيث يمكن وضع ملفات الجافا بداخله ؛ ويحتوى على الملفات الرئيسية لعمل اى تطبيق اندرويد استوديو.
عند الضغط على build.gradle؛ نجد نظام االندرويد المراد عمل التطبيق عليه ؛ نجد مكتوب أخر اصدار
اندرويد 30.3؛ يتم التغيير الى اإلصدار المطلوب ؛ رقم اصدار التطبيق " " versionCodeو "
" versionnameوفى كل مرة نحتاج تحديث التطبيق يتم كتابة اصدار جديد للتطبيق.
54
د /رشا صابر نوفل هتيئة العمل باألندر ويد استوديو الفصل الثامن
-يتم توصيل الهاتف بالجهاز بوصلة usp؛ يتم اختيار " نقل الملفات".
-الدخول على اعدادات الهاتف .
-الذهاب الى حول الهاتف.
-الدخول على اإلصدار.
-رقم اإلصدار يتم الضغط عليه أكثر من مرة حتى تظهر رسالة تم اإلضافة الى المتطورين.
55
د /رشا صابر نوفل هتيئة العمل باألندر ويد استوديو الفصل الثامن
56
د /رشا صابر نوفل هتيئة العمل باألندر ويد استوديو الفصل الثامن
57
د /رشا صابر نوفل هتيئة العمل باألندر ويد استوديو الفصل الثامن
-على االندرويد استوديو نجد ان الهاتف ظهر تلقائيا على البرنامج .
يتم عمل تشغيل Run؛ نجده ظهر على الهاتف الخاص بنا.
58
د /رشا صابر نوفل هتيئة العمل باألندر ويد استوديو الفصل الثامن
59
د /رشا صابر نوفل هتيئة العمل باألندر ويد استوديو الفصل الثامن
لتجربة التطبيق على الهواتف؛ يتم توصيل هاتف بالجهاز ؛ لكن اذا كان جهازى مواصفاته محدودة يمكن
اضافة هاتف محاكى الى التطبيق وذلك عن طريق الخطوات التالية:
60
د /رشا صابر نوفل هتيئة العمل باألندر ويد استوديو الفصل الثامن
ثم نحدد احد الهواتف وليكن 4.65 720 (Galaxy Neثم next
ولتجربة التطبيق:
من الشريط واختار الهاتف المراد تجربة التطبيق عليه كما موضح بلقطة الشاة التالية؛
61
د /رشا صابر نوفل هتيئة العمل باألندر ويد استوديو الفصل الثامن
62
د /رشا صابر نوفل هتيئة العمل باألندر ويد استوديو الفصل الثامن
والعداد المحاكى داخل االندرويد استوديو؛ يتم فتح االندرويد استوديو ومن file؛ أختار Setting؛
63
د /رشا صابر نوفل هتيئة العمل باألندر ويد استوديو الفصل الثامن
64
د /رشا صابر نوفل هتيئة العمل باألندر ويد استوديو الفصل الثامن
من Android API؛ يتم اختيار االندرويد األعلى ؛ ليتم التجربة على أحدث إصدارات الهواتف ؛ تم اختيار
اندرويد 9؛
ومن عالمة +يتم إضافة األجهزة ؛ أختار جهاز منهم للتجربة ؛ تم اختيار النسخة االفتراضة طبقا
لمواصفات الجهاز الخاص بى ؛ ثم دبل كليك عليها ؛ ثم install؛
65
د /رشا صابر نوفل هتيئة العمل باألندر ويد استوديو الفصل الثامن
وبعد االنتهاء ؛ نقوم بعمل Start؛ ويتم تشغيله في كل مرة نريد استخدامه مع االندرويد استوديو .
66
د /رشا صابر نوفل هتيئة العمل باألندر ويد استوديو الفصل الثامن
: ConstraintLayout
عند فتح واجهة التطبيق " النشاء مشروع جديد " نجد ConstraintLayout؛ وبها عبارة داخل عنصر
Text viewالعبارة هي " "hello world؛ كما موضح بلقطة الشاشة التالية.
يتم إضافة جميع العناصر الى واجهة التطبيق بداخله مثل إضافة نص أو صورة أو أزرار وكذلك التحكم في
هذه العناصر.
67
د /رشا صابر نوفل املتغريات يف األندر ويد استوديو الفصل التاسع
أي عناصر داخل االندرويد استوديو يمكن اضافتىها والتحكم فيها عن طريق المتغيرات على النحو التالى :
لو تم فتح واجهة التطبيق من . Layout؛ ثم activity_main.xml؛ نجد عناصر االندرويد استوديو
داخل palette؛ وما يتم اضافته يظهر على واجهة التطبيق " مثل عبارة Hello Worldالموجودة ؛ ويمكن
حذف العبارة ووضع Buttonللتطبيق وذلك على النحو الموضح؛
68
د /رشا صابر نوفل املتغريات يف األندر ويد استوديو الفصل التاسع
ومن خالل الضغط على attributes؛ يظهر لنا العنصر " يتم التحكم فيه حتى نتمكن من عدم
وجود أخطاء" ؛ وال بد من عرض األرقام في ثالثة نواحى من العنصر على األقل حتى تختفى
األخطاء.
-يتم وضع اسم idللعنصر الذى تم اضافته مع مالحظة ال يمكن تكرار اسم idومراعاة ان االسم
يكون باللغة اإلنجليزية ؛ وال يقبل كتابة الرموز والمسافات .
-تاتى مرحلة التحكم بالعنصر داخل ملف الجافا ؛
-يتم كتابة عنصر Buttonفي ملف الجافا mainActivity.javaمع مراعاة ان الحرف األول من
الكلمة كابتل.
-يتم إضافة ; import android.widget.Buttonتلقائيا .
-نكتب اسم المتغير( أحرف صغيرة).
-يتم إضافة باقى عناصر التحكم التي تمكننا من التحكم في الbutton
69
د /رشا صابر نوفل املتغريات يف األندر ويد استوديو الفصل التاسع
الضاقة كلمات " اضغط هنا"
"(button.setTextاضغط هنا;)"
70
د /رشا صابر نوفل تغيري خلفيات العناصر الفصل العاشر
https://www.materialpalette.com/
71
د /رشا صابر نوفل تغيري خلفيات العناصر الفصل العاشر
"android:background="@color/red
72
د /رشا صابر نوفل تغيري خلفيات العناصر الفصل العاشر
يمكن تغيير اللون بطريقة أخرى؛ عند طريق الضغط على العنصر ؛ ثم اختيار شاشة الـ desine؛ والبحث
في قائمة البحث عن background؛ ثم اختيار اللون المناسب؛ كما موضح.
يتم تحديد العنصر الذى يوجد به الكتابة " عنصر " buttonفي المثال ؛ والبحث عنtext color
73
د /رشا صابر نوفل تغيري خلفيات العناصر الفصل العاشر
يتم نسخ الصورة المراد وضعها خلفية ولصقها داخل مجلد .drawable
74
د /رشا صابر نوفل تغيري خلفيات العناصر الفصل العاشر
ثم يتم اختيار الخلفية من نافذة تغيير اللون السابقة ؛ ولكن يتم اختيار المجلد ثم اختيار الصورة.
تم تغيير لون الـ bouutonللون األحمر حتى يظهر على الخلفية ؛ فيصبح شكل التطبيق على النحو
التالى:
75
د /رشا صابر نوفل تغيري خلفيات العناصر الفصل العاشر
: Layouts
عند فتح اعدادات الـ Layouts؛ نجد انه يوجد نوعين من LinearLayoutالنوع األول " horizonta
حيث يسمح بوضع العناصر بجوار بعضها البعض" ؛ النوع الثانى وهو verticalويسمح بوضع العناصر
فوق بعضها.
مع االخذ في االعتبار إمكانية وضع طريقة الـ layoutأي كان نوعها داخل Constraint Layout؛ أو
اضافتها بداخلها ؛ ففي الحالتين تعمل جيدا.فنالحظ بمجرد اضافته ضمن Constraint Layoutأخدت
ارتفاع وعرض الشاشة بالكامل كما موضح بالصورة التالية .
76
د /رشا صابر نوفل تغيري خلفيات العناصر الفصل العاشر
يمكن بعد ذلك التحكم في حجمها واضافة عناصر لها كاضافة مجموعة أزرار نجده تم وضعها فوق البعض
بها كما موضح
ويمكن تغيير نوع العرض من خال فتح وضع الـ splitوتعديل النوع في الكود من verticalألى horizonta
77
د /رشا صابر نوفل تغيري خلفيات العناصر الفصل العاشر
كما يمكن أيضا التعديل على العرض االساسى للتطبيق Constraint Layoutوتحويله الى
LinearLayoutوذلك عن طريق اعدادات الكود ومسح الكود بأول السطر ووضع مكانه
78
د /رشا صابر نوفل تغيري خلفيات العناصر الفصل العاشر
79
د /رشا صابر نوفل تغيري خلفيات العناصر الفصل العاشر
هناك طريقتين
يتم انشاء االمر ضمن الـ classالخاص بواجهة التطبيق الذى يحتوى على العنصر المراد وذلك على النحو
التالى :
}
-يتم وضع داخل األقواس األمر Viewمع مراعاة الحرف األول كبير ووضع متغير بنفس االسم
" viewأحرف صغيرة.
-يتم كتابة ; import android.view.Viewتلقائيا واذا لم يتم كتابتها فنكتبها
نحن ".بمجرد كتابة importتكتب ".
80
د /رشا صابر نوفل تغيري خلفيات العناصر الفصل العاشر
نضع األمر داخل " methodاألمر المراد تنفيذه عند الضغط على العنصر" ؛ فمثال للتطبيق على
تغيير خلفية التطبيق باختيار لون محدد بالنقر على الزر ؛ يتم وضع األوامر الخاصة بذلك على
النحو الموضح أدناه
-1يتم وضع idللواجهة المستخدمة Constraint Layoutباسم .home
-2يتم وضع متغير ConstraintLayoutنسميه homeونكتب نوع المتغير داخل االقواس ؛ ثم
تحديده من خالل . id
-3يتم كتابة اسم المتغير homeثم تحديد العناصر المراد تغييرها " الخلفية عن طريق االلون" وهذا
كما موضح باالكواد التالية .
-وبهذا نكون قد أنشأنا method؛ متبقى لنا استدعاؤه ؛فمثال نريد استدعاؤه على الزر المنشىء مثبقا
81
د /رشا صابر نوفل تغيري خلفيات العناصر الفصل العاشر
نأتى على Design؛ نحدد العنصر" الزر" ثم في البحث نبحث عن on Click؛ ثم نختار اسم -
method؛
-وبهذا تم استدعاء الميثود بحيث مجرد النقر على الزر يتم تنفيذ األوامر التي تم كتابتها داخل الميثود
" تغيير خلفية التطبيق".
-يتم عمل runنجده تم التنفيذ .
-نأتى على نافذة main Activity.javaونكتب العنصر Image viewمع مراعاة الحرف األول كبير؛ ثم
نقوم بعمل متغير باالسم "نفس االسم حروف صغيرة" .
-يتم إضافة االمر المراد تنفيذه داخل الميثود مثلما حدث من قبل ؛ فمثال يتم وضع نفس األمر السابق
مع تغيير اللون .
82
د /رشا صابر نوفل تغيري خلفيات العناصر الفصل العاشر
ملحوظة :إذا لم يتم وضع العناصر ؛ يتم تعيين مركز ارتكازهم مرة أخرى .
83
د /رشا صابر نوفل Web viewيف األندر ويد استوديو الفصل احلادي عشر
تسمح لك web viewبعرض الويب من خالل التطبيق الخاص بك وتصفح الويب من خالله؛
يتم سحبها وافالتها بالتطبيق؛ يتم اضافتها تلقائيا على واجهة التطبيق بنسبة match_parent( 100%
84
د /رشا صابر نوفل Web viewيف األندر ويد استوديو الفصل احلادي عشر
يتم وضع idلعنصر web viewللتحكم فيه من خالل ملف جافا " أسميه " web viewمع مراعاة أن
يكون الحرف األول صغير.
-نذهب الى ملف الجافا ؛ نقوم بعمل متغير لعنصر " Web Viewالحرف األول كبير من كل كلمة"
؛ ثم نسمى المتغير وليكن ( = web viewنضع قيمة العنصر مرة أخرى).
-بعد ذلك يتم تحديد عنوان urlالمراد تصفحه عبر التطبيق ؛ وذلك من خالل تحديد اسم المتغير ثم .
ثم )( loadUrlووضع الموقع المراد تصفحه داخل االقواس؛"تم وضح عنوان صفحة الفيس بوك
الخاصة بى"
85
د /رشا صابر نوفل Web viewيف األندر ويد استوديو الفصل احلادي عشر
ولعرض الويب ضمن التطبيق يستخدم ؛ اسم المتغير ثم setWebviewClinet؛ وبدون كتابة هذه
الخاصية ؛ يتطلب التطبيق الدخول على الرابط السابق والخروج من التطبيق.
;))(webView.setWebViewClient(new WebViewClient
بعد ذلك يتم انشاء متغير من نوع websettingلعمل اعدادات على الـ webview
ولتكملة اعدادات الوصول الى ملفات الهاتف يتم الذهاب الى ملف manifests
86
د /رشا صابر نوفل Web viewيف األندر ويد استوديو الفصل احلادي عشر
بعد ذلك يتم عمل runللتطبيق ؛ نجده عرض الويب على التطبيق على الهاتف.
87
د /رشا صابر نوفل Web viewيف األندر ويد استوديو الفصل احلادي عشر
ولكن هناك مشكلة بسيطة ؛ عند العودة من زر العودة الخاص بالهاتف يتم الخروج من التطبيق بدال من
العودة خطوة ويتم حل ذلك عن طريق؛ عمل " methodوهو methodجاهز عبر االندرويد استوديو"
يسمى onKeyDown؛ ونضع بداخله شرط ؛ أذا تم الضغط على زر العودة يتم العودة للخطوة السابقة
مع وضع شرط أخر وهو أن الـ webviewقادر على العودة .
ملحوظة " نجد أنه غير قادر على استدعاء الـ " webviewظهرت باللون األحمر “داخل هذا " method
فيتم عمل تعديل بسيط " حيث يتم عمل المتغير ضمن ال classوداخل method؛ وبدل انشاء متغير
جديد يتم تحديده ؛ كما موضح بالشاشة أدناه ؛
واستكمال الشرط ؛
@Override
public boolean onKeyDown(int KeyCode, KeyEvent
{)event
&& if (KeyCode==KeyEvent.KEYCODE_BACK
{))(webView.canGoBack
;)(webView.goBack
;return true
88
رشا صابر نوفل/د يف األندر ويد استوديوWeb view الفصل احلادي عشر
}
return super .onKeyDown(KeyCode,event);
}
}
نجد أنه للدخول على الموقع والتصفح عند الدخول على اى شيء داخل الويب ؛ للعودةrun وبعد عمل
.بمجرد الضغط على زر العودة يتم ذلك
: لتصبح الصفة في النهاية
package com.example.rsaha_app;
import androidx.appcompat.app.AppCompatActivity;
import androidx.constraintlayout.widget.ConstraintLayout;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.ImageView;
public class MainActivity extends AppCompatActivity {
WebView webView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
webView = (WebView)findViewById(R.id.webview);
webView.loadUrl("https://www.facebook.com/DrRashaNofal/");
webView.setWebViewClient(new WebViewClient());
WebSettings webSettings = webView.getSettings();
للسماح بالجافا سكريبت يتم عمل بعض االعدادت منها //
webSettings.setJavaScriptEnabled(true);
المكانية التخزين المؤقت //
webSettings.setDomStorageEnabled(true);
المكانية التكبير والتصغير //
webSettings.setDisplayZoomControls(true);
webSettings.setSupportZoom(true);
التحاة الوصول الى الملفات على الهاتف //
webSettings.setAllowContentAccess(true);
webSettings.setAllowFileAccess(true);
للعمل مع جميع األجهزة //
webSettings.setUseWideViewPort(true);
}
@Override
89
رشا صابر نوفل/د يف األندر ويد استوديوWeb view الفصل احلادي عشر
public boolean onKeyDown(int KeyCode, KeyEvent event){
if (KeyCode==KeyEvent.KEYCODE_BACK &&
webView.canGoBack()){
webView.goBack();
return true;
}
return super .onKeyDown(KeyCode,event);
}
90
د /رشا صابر نوفل Web viewيف األندر ويد استوديو الفصل احلادي عشر
:Loadurlحيث يتم ربطها بصورة مثال أو زر؛ وللضغط على الصورة يتم الوصول الى الموقغ .
-في البداية يتم طريقة عرض التطبيق إلى ) LinearLayout(vertical؛سبق وأن ذكرنا .
-يتم إضافة Buttonويتم كتابة النص المراد ظهوره على الزرار وليكن " " YouTube؛ حيث يتم
االنتقال من التطبيق الى قناة اليويتيوب الخاصة بى ؛ وتغيير لون الخلفية ؛ ولون الكتابة وحجم
الخط ونوعه ؛
91
د /رشا صابر نوفل Web viewيف األندر ويد استوديو الفصل احلادي عشر
نحتاج تنفيذ األمر عند الضغط على الزر؛ وذلك عن طريق عمل methodمن نوع void؛ يتم تسميته
LoadUrl؛ واضافة متغير داخله من نوع view view؛ وبعد ذلك استدعاء الـ webviewثم
LoadUrl method؛ وهذه األنواع تكون جاهزة داخل االندرويد استوديو ؛ ثم نضع رابط المطلوب.
بعد ذلك يتم استدعاء onClick؛ بتحديد الـ buttonوالبحث عن onClickواختيار اسم الزر " الذى
سبق وأن وضعناه".
92
د /رشا صابر نوفل Web viewيف األندر ويد استوديو الفصل احلادي عشر
ثم عمل run؛ فيظهر التطبيق على الهاتف وبالضغط على الزرار يتم الوصول الى موقع اليويتيوب
الخاص بى على النحو الموضح؛
93
د /رشا صابر نوفل Web viewيف األندر ويد استوديو الفصل احلادي عشر
94
د /رشا صابر نوفل Web viewيف األندر ويد استوديو الفصل احلادي عشر
نختار االيقونة الخاصة ؛ ثم نحدد اللون المناسب ونضع اسم لها ثم ok؛ ثم next؛ ثم . finsh
بعد ذلك يتم إضافة linear layoutمن نوع horizonلعرض العناصر بجوار بعضها البعض؛ وضبط
ارتفاعها وليكن P 500dp
95
د /رشا صابر نوفل Web viewيف األندر ويد استوديو الفصل احلادي عشر
يتم إضافة الصور بها وذلك من تحديد comaaثم image viewسحبها وافالتها داخل الـlayout
96
د /رشا صابر نوفل Web viewيف األندر ويد استوديو الفصل احلادي عشر
97
د /رشا صابر نوفل Web viewيف األندر ويد استوديو الفصل احلادي عشر
نجده يطلب منا وضع الجملة داخل buildgradleapp؛ فيتم وضعها ثم عمل Synce Now
نجده تم تصحيح األخطاء؛ يتبقي لنا ربط هذه العناصر بالضغط عليها ؛
98
د /رشا صابر نوفل Web viewيف األندر ويد استوديو الفصل احلادي عشر
عند تحويل موقع الويب الى تطبيق أندرويد ؛ وتصفح الويب من خالل التطبيق ؛ نجد ان الفيديوهات ال
يمكن عرضها " ملئ الشاشة" كما في الويب؛ قامت شركة جوجل بعمل classجاهز يمكننا استخدامه هنا
في التطبيق ؛ حيث يتم وضعه داخل MainActivty-javaالخاص بالتطبيق ؛ ضمن الكالس األساسي ؛
وخارج الـ method onCreate؛ " مكان لصق الـ "classفي لقطة الشاشة التالية:
99
رشا صابر نوفل/د يف األندر ويد استوديوWeb view الفصل احلادي عشر
MyChrome() {}
((FrameLayout)getWindow().getDecorView()).removeView(this.mCusto
100
رشا صابر نوفل/د يف األندر ويد استوديوWeb view الفصل احلادي عشر
mView);
this.mCustomView = null;
getWindow().getDecorView().setSystemUiVisibility(this.mOriginalS
ystemUiVisibility);
setRequestedOrientation(this.mOriginalOrientation);
this.mCustomViewCallback.onCustomViewHidden();
this.mCustomViewCallback = null;
}
((FrameLayout)getWindow().getDecorView()).addView(this.mCustomVi
ew, new FrameLayout.LayoutParams(-1, -1));
getWindow().getDecorView().setSystemUiVisibility(3846);
}
}
. الخاص بناwebviewثم نقوم بربطه بالـ
webView.setWebChromeClient(new MyChrome());
101
د /رشا صابر نوفل Web viewيف األندر ويد استوديو الفصل احلادي عشر
وداخل الـ methodيتم إضافة األوامر التي نرغب في تنفيذها كل مرة يتم تحميل صفحات . webview؛
وليكن وضع رسالة عند التحميل ؛ بدء التحميل وأهال بك ؛ وعند االنتهاء نضع رسالة ؛ تم التحميل
102
د /رشا صابر نوفل Web viewيف األندر ويد استوديو الفصل احلادي عشر
نقوم بعمل متغير من نوع string؛ ونسمى المتغير اسم ثم نستدعى الـ method
103
د /رشا صابر نوفل Web viewيف األندر ويد استوديو الفصل احلادي عشر
وبهذا يتم تخزين عنوان الـويب الذى يتم تصفحه من خالل التطبيق الخاص بى وكذلك Url؛ ولكن بهذا
يتم تخزينه مرة واحدة ؛ وقد يستدعى األمر في التطبيق الى الدخول في أكثر من قسم داخل التطبيق ؛
فكيف يتم التخزين في كل مرة ؛
فيتم عمل ذلك داخل methodالـ onPageFinishedحيث يتم وضع نفس المتغيرات كما هو موضح
التطبيق :
يتم اضافة buttonونسميه title؛ ونقوم بإضافة plaintextداخل الـ webview ,ونعطيه idوليكن url
؛ داخل الـ classالمسئول عن هذه الواجهة " “ mainActivityيتم عمل متغييرين ؛ للعنصرين buttonو
plaintext
104
د /رشا صابر نوفل Web viewيف األندر ويد استوديو الفصل احلادي عشر
وداخل onPageFinishedيتم كتابة المتغيرات ويتم عمل الرسالة التي تظهر كتعليق" لعدم الحاجة
اليها حاليا".
105
د /رشا صابر نوفل حتويل موقع الويب اىل تطبيق أند رويد الفصل الثاني عشر
يمكن تحويل ملفات تم انشاؤها بالـ html , css ,JSالى تطبيق باالندرويد استوديو
-لدينا مشروع تم انشاؤه على ويب ؛ من االندرويد استوديو ؛ نفتح المجلد manifests؛
نضع إمكانية عمل التطبيق على االنترنت؛
106
د /رشا صابر نوفل حتويل موقع الويب اىل تطبيق أند رويد الفصل الثاني عشر
-تظهر لنا نافذة نضغط على finsh؛ نجده أنشىء لنا ملف جديد
-يتم نسخ جميع الملفات والصور الخاصة بالويب ولصقها داخل هذا المجلد الجديد
107
د /رشا صابر نوفل حتويل موقع الويب اىل تطبيق أند رويد الفصل الثاني عشر
108
د /رشا صابر نوفل حتويل موقع الويب اىل تطبيق أند رويد الفصل الثاني عشر
نقوم بنفس الخطوات السابق شرحها من حيث استدعاء المتغير و LoadUrl؛ ولكن هنا يتم وضع -
مسار ملف html؛ حيث يتم كتابة أي مسار داخل االندرويد استوديو بالشكل _file:///android
اسم الملف بدون / sثم اسم ملف htmlوصيغته".
-بعد ذلك نقوم بعمل االعدادات الخاصة بظهور الويب كما سبق وان ذكرناها في الدروس السابقة.
109
د /رشا صابر نوفل حتويل موقع الويب اىل تطبيق أند رويد الفصل الثاني عشر
110
د /رشا صابر نوفل حتويل موقع الويب اىل تطبيق أند رويد الفصل الثاني عشر
البداية ؛ الصور المتوفرة نجدها في ملف mipmap :داخل مجلد res؛ وهى صورة واحدة وبمقاسات
مختلفة ؛كما موضح:
111
د /رشا صابر نوفل حتويل موقع الويب اىل تطبيق أند رويد الفصل الثاني عشر
ثم اختيار image؛ فتكون نافذة تحميل الصورة ؛ يتم تحميلها من ملفات الجهاز.
112
د /رشا صابر نوفل حتويل موقع الويب اىل تطبيق أند رويد الفصل الثاني عشر
تظهر الصورة المختارة وبمقاييس مختلفة للتتناسب مع كافة األجهزة؛ يمكن ضبط لون الخلفية والتحكم في
شكل الصورة كما موضح بلقطة الشاشة التالية :
113
د /رشا صابر نوفل حتويل موقع الويب اىل تطبيق أند رويد الفصل الثاني عشر
114
د /رشا صابر نوفل حتويل موقع الويب اىل تطبيق أند رويد الفصل الثاني عشر
لو أردنا التعديل على هذا االسم بعد االنتهاء من انشاء التطبيق ؛
115
د /رشا صابر نوفل حتويل موقع الويب اىل تطبيق أند رويد الفصل الثاني عشر
يفضل قبل تغيير االسم البحث في الـ googleplayعن االسم الجديد هل هو متوفر أم ال .
116
د /رشا صابر نوفل حتويل موقع الويب اىل تطبيق أند رويد الفصل الثاني عشر
اال أن هناك بعض الملفات لم يتم تغيير االسم بها ؛ فيتم تغيريها ؛ نفتح Build gradle؛
117
د /رشا صابر نوفل انشاء تطبيق بواجهات متعددة الفصل الثالث عشر
فمثال لدينا تطبيق من واجهة ونريد التنقل الى واجهات أخرى عير أزرار أو عبارات محددة؛
118
د /رشا صابر نوفل انشاء تطبيق بواجهات متعددة الفصل الثالث عشر
-لو أردنا االنتقال الى الواجهة الجديدة من خالل زر بالواجهة األساسية للتطبيق ؛ يتم إضافة الزر ؛ وكتابة
النص الخاص بالزر وليكن (.( GPS
-نفتح mainactivty؛ نقوم بإنشاء methodجديد من نوع void؛ ونحدد فيه الدخول على الواجهة
الجديدة من خالل objectداخل االندرويد استوديو يسمى Intent
119
د /رشا صابر نوفل انشاء تطبيق بواجهات متعددة الفصل الثالث عشر
تم إضافة image viewالى واجهة التطبيق؛ اعطناه idوليكن rasha؛ لكى نضغط على الصورة يتم
توصيلنا بالرابط وفتحه خارج التطبيق نذهب على صفحة الجافا الخاصة بالتطبيق ونقوم بعمل method؛
ونكمل باقى األوامر كما موضح بلقطة الشاشة التالية ؛
يتبقى لنا استدعاء الصورة لنعطيها األمر عند الضغط على الصورة يتم تحويلنا الى الرابط ؛ يتم تحديد
العنصر " الصورة " والبحث عن OnClick؛ واختيار العنصر " من خالل اسم الـ. id
120
د /رشا صابر نوفل انشاء تطبيق بواجهات متعددة الفصل الثالث عشر
121
د /رشا صابر نوفل انشاء تطبيق بواجهات متعددة الفصل الثالث عشر
122
د /رشا صابر نوفل انشاء تطبيق بواجهات متعددة الفصل الثالث عشر
.setGravity وللتحكم في عرض الرسالة ؛ نضيف قبل تنفيذ االمر األخير اسم المتغير ثم
(Gravity.CENTER,0,0
Handler ClassوRunnable
هي كالسات جاهزة داخل االندرويد استوديو ؛ لتحديد مدة لتنفيذ األوامر ؛
لتأخير تنفيذ األوامر نحتاج الى Handler objectو أوبجكت أخر من نوع Runnable؛
ويكتب على النحو التالى " األوبجكت – اسم متغير – ثم = newثم تحديد األوبجكت مرة أخرى على
النحو التالى ؛
123
د /رشا صابر نوفل انشاء تطبيق بواجهات متعددة الفصل الثالث عشر
لتحديد الفترة المطلوبة ؛ " بعد فترة ؟ تظهر الرسالة بعد أن يتم استدعاء الـ method؛ بكتابة األوامر
التالية ؛
وفى النهاية يتم كتابة اسم الـ methodفي األعلى حتى يتم ظهور الرسالة بعد فتح التطبيق مباشرة ؛ لتكون
النافذة كما يلى ؛
124
د /رشا صابر نوفل انشاء تطبيق بواجهات متعددة الفصل الثالث عشر
وإذا أردنا تكرار تنفيذ األوامر كل فترة زمنية محددة ؛ يتم إضافة نفس الرسالة السابقة ضمن الـmethod
األساسية بعد كل العناصر الموجودة
وبهذا يتم تنفيذ االمر وظهور الرسالة بعد خمس ثوانى ؛ وتكرار ظهورها كل خمس ثوانى ؛ وللتحكم في تكرار
التنفيذ من عدمه " يعنى ان المستخدم هو الذى يتحكم اذا كان يريد تكرار تنفيذ األمر أم ال "
125
د /رشا صابر نوفل انشاء تطبيق بواجهات متعددة الفصل الثالث عشر
أو أن هناك زر على واجهة التطبيق ؛ فبمجرد الضغط يتم التوقف عن تنفيذ األمر وظهور الرسالة
التحقق من اتصال الهاتف باإلنترنت من خالل تطبيقك الخاص ( شبكة واى فاى أو بيانات الهاتف):
بعد ذلك يتم وضع األوامر والشروط التالية داخل صفحة javaالخاصة بواجهة التطبيق ؛
126
رشا صابر نوفل/د انشاء تطبيق بواجهات متعددة الفصل الثالث عشر
ConnectivityManager connMgr =
(ConnectivityManager)
getSystemService(Context.CONNECTIVITY_SERVICE);
boolean isWifiConn = false;
boolean isMobileConn = false;
for (Network network : connMgr.getAllNetworks()) {
NetworkInfo networkInfo =
connMgr.getNetworkInfo(network);
if (networkInfo.getType() ==
ConnectivityManager.TYPE_WIFI) {
isWifiConn |= networkInfo.isConnected();
}
if (networkInfo.getType() ==
ConnectivityManager.TYPE_MOBILE) {
isMobileConn |= networkInfo.isConnected();
}
}
127
د /رشا صابر نوفل انشاء تطبيق بواجهات متعددة الفصل الثالث عشر
؛ وبفحص الخطأ يقول أن هذه األوامر ال تعمل مع اندرويد 19فال بد من تغير االندوريد الى 21أقل شىء
ولو أردنا وضع شروط محددة ؛ فمثال لو أردنا وضع شروط اذا كان المستخدم غير متصل بشبكة البيانات
أو شبكة الوافاى ؛ ويوضع شرط ما ؛
فمثال يمكن ظهور رسالة للمستخدم في حالة الهاتف غير متصل باالنترنت ؛
وفى حالة إذا كان المستخدم متصل بالشبكة بالواى فاى او بالبيانات " أي إحداهما " ويتم وضع شروط
محددة ؛ وذلك على النحو التالى ؛
128
د /رشا صابر نوفل انشاء تطبيق بواجهات متعددة الفصل الثالث عشر
نالحظ أن التظليل خلف الكود مختلف ؛ فلو شاهدنا المالحظات على الشرط نجده يقول أنه يمكن اختصار
الكود
واذا أردنا وضع شرط إذا كان المستخدم غير متصل بشبكة الوافاى
{) if (isWifiConn==falseيتم وضع الشرط هنا
}
وعلى نفس المنوال ؛اذا أردنا وضع شرط إذا كان المستخدم غير متصل بشبكة بيانات الهاتف
{) if (isMobileConn==falseيتم وضع الشرط هنا
}
129
د /رشا صابر نوفل انشاء تطبيق بواجهات متعددة الفصل الثالث عشر
130
د /رشا صابر نوفل انشاء تطبيق بواجهات متعددة الفصل الثالث عشر
فينم إضافة الوضع االفقى؛ فيمكن عمل التصميم المناسب للوضع االفقى كيفما شئت ؛
131
رشا صابر نوفل/د انشاء تطبيق بواجهات متعددة الفصل الثالث عشر
132
د /رشا صابر نوفل انشاء تطبيق بواجهات متعددة الفصل الثالث عشر
133
د /رشا صابر نوفل انشاء تطبيق بواجهات متعددة الفصل الثالث عشر
134
د /رشا صابر نوفل انشاء تطبيق بواجهات متعددة الفصل الثالث عشر
تظهر لنا نافذة ؛ فال بد من انشاء مفتاح الستخراج الملف بهذه الصيغة ؛ ملحوظة هذا المفتاح ال بد من
حفظه ألننا بحاجة اليه في كل مرة نحتاج استخراج ملف بصيغة. APK
135
د /رشا صابر نوفل انشاء تطبيق بواجهات متعددة الفصل الثالث عشر
تظهر نافذة ؛ نختار مسار حفظ المفتاح ؛ وإنشاء كلمة مرور ووضع البيانات الشخصية؛ اسم المدينة
والمحافظة ورمز الدولة ؛
136
د /رشا صابر نوفل انشاء تطبيق بواجهات متعددة الفصل الثالث عشر
تظهر النافذة التالية ؛ نحدد مكان حفظ الملف؛ وتختار الخيارات الموضحة ؛ ثم finsh
137
الباب البالث
ف غ جل ا م ل معلا ظ ن ف ن ن قيبطت
اب الأ در و د ي م و اب را بة
د /رشا صابر نوفل مقدمة الباب الثالث :تطبيقات األندر ويد يف نظم املعلومات اجلغرافية
مقدمة:
تزايدت أهمية تطبيقات نظم المعلومات الجغرافية التي تتعامل مع انظمة األندرويد في األونة األخيرة؛
فتطبيقات األندرويد المتعلقة بنظم المعلومات الجغرافية صممت للمستخدمين حتى تمكنهم من التعامل مع
البيانات الجغرافية المكانية من خالل هواتفهم المحمولة ،كما تساعد هذه التطبيقات على متابعة البيانات
كما أن لتطبيقات االندرويد أهمية كبيرة في مجاالت نظم المعلومات الجغرافية ليس فقط في كونها أدوات
لجمع البيانات من الميدان وتحريرها إال أنها تساهم مع انترنت األشياء في الحصول على Real Time Data
؛ ومن ثم تكوين Big Data؛ وأصبحت تقنية تستخدم لإلنذار فى حاالت الحوادث أو اإلنذارات المبكرة لحدوث
الكوارث ؛ وبالتالي فأصبحت تساعد على اتخاذ القرار المناسب سواء للمستخدم البسيط أو المتخصص فى نظم
المعلومات الجغرافية.
وسوف نوضح في هذا الباب كيفية استخدام خرائط جوجل وخرائط الـ open street map؛ النشاء تطبيق
خاص بنا ؛ وبعد ذلك نعرض كيفية استخدام ArcGIS Runtime SDK؛ وفى نهاية الباب يتم شرح كيفية
بناء تطبيق ويب للحصول على بيانات الطقس وذلك باستخدام . map weather open
139
د /رشا صابر نوفل التعامل مع خرائط جوجل يف االندرويد أستوديو الفصل الرابع عشر
تظهر النافذة الخاصة بجوجل ماب؛ نذهب الى مطور جوجل للحصول على apiالخاص بى ؛
/https://developers.google.com/maps
-يتم تسجيل الدخول الى حساب جوجل الخاص بى.
140
د /رشا صابر نوفل التعامل مع خرائط جوجل يف االندرويد أستوديو الفصل الرابع عشر
141
د /رشا صابر نوفل التعامل مع خرائط جوجل يف االندرويد أستوديو الفصل الرابع عشر
142
د /رشا صابر نوفل التعامل مع خرائط جوجل يف االندرويد أستوديو الفصل الرابع عشر
143
د /رشا صابر نوفل التعامل مع خرائط جوجل يف االندرويد أستوديو الفصل الرابع عشر
144
د /رشا صابر نوفل التعامل مع خرائط جوجل يف االندرويد أستوديو الفصل الرابع عشر
145
د /رشا صابر نوفل التعامل مع خرائط جوجل يف االندرويد أستوديو الفصل الرابع عشر
في ملف manifest؛ نضع permissionالخاص بإمكانية التطبيق باالتصال على االنترنت .
146
د /رشا صابر نوفل التعامل مع خرائط جوجل يف االندرويد أستوديو الفصل الرابع عشر
نالحظ أنه في map activity java؛ يوجد احداثيات لمدينة سيدنى ؛ يمكن تغييرها باالحداثيات المطلوبة ؛
147
د /رشا صابر نوفل التعامل مع خرائط جوجل يف االندرويد أستوديو الفصل الرابع عشر
لعمل زووم يتم تغيير الكود " أسفل االحداثيات الى newLatLongZoom
148
د /رشا صابر نوفل التعامل مع خرائط جوجل يف االندرويد أستوديو الفصل الرابع عشر
149
د /رشا صابر نوفل التعامل مع خرائط جوجل يف االندرويد أستوديو الفصل الرابع عشر
المكانية تغيير خريطة األساس الى satellite؛ الضافة إمكانية عمل زووم :
150
رشا صابر نوفل/د التعامل مع خرائط جوجل يف االندرويد أستوديو الفصل الرابع عشر
لتتغيير اللوكيشن بواسطة المستخدم؛ فعندما يضغط المستخدم على الشاشة تظهر عالمة اللوكيشن ؛
mMap.setOnMapClickListener (new
GoogleMap.OnMapClickListener () {
@Override
public void onMapClick(@NonNull
@org.jetbrains.annotations.NotNull LatLng latLng) {
Toast.makeText (MapsActivity.this, latLng
.latitude + ","+latLng.latitude,
Toast.LENGTH_LONG).show ();
mMap.addMarker (new MarkerOptions
().position (latLng).title ("location")
);
}
});
}
151
د /رشا صابر نوفل التعامل مع خرائط جوجل يف االندرويد أستوديو الفصل الرابع عشر
لكن لو أردنا مسح عالمة الموقع القديمة ووضع عالمة جديدة؛ يتم إضافة ;)( mMap.clear
ملحوظة :التطبيق االن لم يمكن تصديره والعمل معه من قبل المستخدمين ألنه على نظام debug؛ وهو
نظام تجريبى للتطبيق ؛
152
د /رشا صابر نوفل التعامل مع خرائط جوجل يف االندرويد أستوديو الفصل الرابع عشر
فمن file؛ نفتح المجلد الذى يحفظ به المشروع ونفتح app؛ ثم مجلد release؛ داخل value؛ نجد ملف
map,api؛يتم فتحه ولصق apiبداخله ؛
153
د /رشا صابر نوفل استخدام خريطة open street map الفصل اخلامس عشر
الدخول على Build gradileواضافة الرابط الذى تم نسخه على النحو التالى:
154
د /رشا صابر نوفل استخدام خريطة open street map الفصل اخلامس عشر
ثم تغيير اإلصدار ؛ حيث يتم نقل اإلصدار من الموقع السابق ذكر:
ويتم اضافته للكود السابق نسخه مكان كلمة > <VERGIN؛ ليصبح على النحو التالي:
نجد وجد خطأ في السطر الذى يليله ؛ يتم تصحيحه باختيار اإلصدار المناسب
155
رشا صابر نوفل/د open street map استخدام خريطة الفصل اخلامس عشر
ليصبح
testImplementation 'junit:junit:'
156
د /رشا صابر نوفل استخدام خريطة open street map الفصل اخلامس عشر
يظهر التطبيق على النحو الموضح ؛ ويتم مسح العناصر الموضحة بلقطة الشاشة؛ TextView
157
رشا صابر نوفل/د open street map استخدام خريطة الفصل اخلامس عشر
158
رشا صابر نوفل/د open street map استخدام خريطة الفصل اخلامس عشر
159
د /رشا صابر نوفل استخدام خريطة open street map الفصل اخلامس عشر
160
رشا صابر نوفل/د open street map استخدام خريطة الفصل اخلامس عشر
ثم
161
رشا صابر نوفل/د open street map استخدام خريطة الفصل اخلامس عشر
if
(ActivityCompat.shouldShowRequestPermissionRationale
(MainActivity.this, permission[0])){
AlertDialog.Builder builder = new
AlertDialog.Builder (MainActivity.this);
");اذن الموقع builder.setTitle ("
هذا التطبيق يتطلب الوصول builder.setMessage ("
");الى الموقع
", new موافق builder.setPositiveButton ("
DialogInterface.OnClickListener () {
@Override
public void onClick(DialogInterface
dialog, int which) {
}
});
", new الغاء builder.setPositiveButton ("
DialogInterface.OnClickListener () {
@Override
public void onClick(DialogInterface
dialog, int which) {
}
});
builder.show ();
} else if (appPrefs.getBoolean (permission[0] ,
false)){
} else {
}
SharedPreferences.Editor editor =appPrefs.edit ();
editor.putBoolean (permission[0] , true );
editor.commit ();
} else {
162
رشا صابر نوفل/د open street map استخدام خريطة الفصل اخلامس عشر
DialogInterface.OnClickListener () {
@Override
public void onClick(DialogInterface
dialogInterface, int i) {
dialogInterface.cancel ();
}
});
", new إلغاءbuilder.setPositiveButton ("
DialogInterface.OnClickListener () {
@Override
public void onClick(DialogInterface
dialogInterface, int i) {
dialogInterface.cancel ();
}
});
builder.show ();
163
رشا صابر نوفل/د open street map استخدام خريطة الفصل اخلامس عشر
package com.example.datacolection_app;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import android.Manifest;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.icu.text.CaseMap;
import android.net.Uri;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.provider.Settings;
import android.widget.Toast;
import org.osmdroid.api.IMapController;
import org.osmdroid.config.Configuration;
import
org.osmdroid.tileprovider.tilesource.TileSourceFactory;
import org.osmdroid.util.GeoPoint;
import org.osmdroid.views.MapView;
public class MainActivity extends AppCompatActivity {
MapView map = null;
Context ctx = null;
IMapController mapController = null;
float initialzoom = 15;
GeoPoint initialCentre = new GeoPoint (30.0, 31.0);
// PREFS
SharedPreferences appPrefs = null;
//CONSTANTS
private static final int REQUEST_GPS = 9001;
private static final int
REQUEST_PERMISSION_SETTINGS = 1001;
//PERMISSION STRINGS
String[] permission = new
164
رشا صابر نوفل/د open street map استخدام خريطة الفصل اخلامس عشر
String[]{Manifest.permission.ACCESS_FINE_LOCATION};
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_main);
// CONFIGURATION
ctx = getApplicationContext ();
Configuration.getInstance ().load (ctx,
PreferenceManager.getDefaultSharedPreferences (ctx));
// MAP INITALITE
map = (MapView) findViewById (R.id.map);
// TILESOURCE
map.setTileSource (TileSourceFactory.MAPNIK);
// MAP CONNECTOR , ZOOM , CENTER
mapController = map.getController ();
mapController.setZoom (initialzoom);
mapController.setCenter (initialCentre);
//INIT PREFS
appPrefs = getSharedPreferences ("GISAppPrefs",
MODE_PRIVATE);
getLocationPermission ();
}
165
رشا صابر نوفل/د open street map استخدام خريطة الفصل اخلامس عشر
166
رشا صابر نوفل/د open street map استخدام خريطة الفصل اخلامس عشر
});
", new الغاء builder.setPositiveButton ("
DialogInterface.OnClickListener () {
@Override
public void onClick(DialogInterface
dialogInterface, int which) {
dialogInterface.cancel ();
}
});
builder.show ();
} else {
ActivityCompat.requestPermissions
(MainActivity.this , permission ,REQUEST_GPS);
}
SharedPreferences.Editor editor =appPrefs.edit
();
editor.putBoolean (permission[0] , true );
editor.commit ();
} else {
//greanted
getGPSLocation ();
}
}
@Override
public void onRequestPermissionsResult(int
requestCode, @NonNull
@org.jetbrains.annotations.NotNull String[]
permissions, @NonNull
@org.jetbrains.annotations.NotNull int[] grantResults)
{
super.onRequestPermissionsResult (requestCode,
permissions, grantResults);
if (requestCode == REQUEST_GPS){
if (grantResults.length>0 &&
grantResults[0] == PackageManager.PERMISSION_GRANTED){
getGPSLocation ();
} else {
غير Toast.makeText (MainActivity.this,"
167
رشا صابر نوفل/د open street map استخدام خريطة الفصل اخلامس عشر
}
}
}
}
168
د /رشا صابر نوفل تطبيقات األندر ويد باستخدام ArcGIS Runtime SDK الفصل السادس عشر
:SDKاختصار لـ Software Development Kit؛ وهى األدوات واالضافات التي يستخدمها مطورى
االندرويد .
يكون ملف مضغوط ؛ يتم فك الملف ؛ نجد أنه يوجد ملف libs؛ بداخله ملفات ؛ يتم نسخها ولصقها داخل
المجلد libs؛ في برنامج االندرويد استوديو ؛ حتى يتم الوصول الى الخرائط.
مع مراعاة األخذ في االعتبار اصدار النسخة التي تم تثبيتها ؛ حيث أنها هي التي تستخدم في الحصول
على الخرائط.؛ هنا تم استخدام نسخة . 10.0.1
169
د /رشا صابر نوفل تطبيقات األندر ويد باستخدام ArcGIS Runtime SDK الفصل السادس عشر
-فتح االندرويد استوديو؛ نحتاج اجراء بعض التعديالت ؛ نفتح ملف . build.gradle
يكتب الكود التالى والخاص باستدعاء خريطة ايزرى -
{ maven
'url 'https://esri.jfrog.io/artifactory/arcgis
}
170
رشا صابر نوفل/د ArcGIS Runtime SDK تطبيقات األندر ويد باستخدام الفصل السادس عشر
.SynceNow ثم-
: التاليةpermission ؛ يتم وضعmanifests وفى-
<uses-permission android:name="android.permission.INTERNET"
/>
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission
android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-feature android:glEsVersion="0x00020000"
android:required="true" />
171
رشا صابر نوفل/د ArcGIS Runtime SDK تطبيقات األندر ويد باستخدام الفصل السادس عشر
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
tools:ignore="MissingClass"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"/>
mv = (MapView)findViewById(R.id.map1);
ArcGISMap map = new
172
رشا صابر نوفل/د ArcGIS Runtime SDK تطبيقات األندر ويد باستخدام الفصل السادس عشر
@Override
protected void onResume() {
super.onResume ();
mv.resume ();
}
173
د /رشا صابر نوفل تطبيقات األندر ويد باستخدام ArcGIS Runtime SDK الفصل السادس عشر
األول :أن نظام االندرويد 19؛ولكى يعمل ال بد وأن يكون بدء من 23
الخطأ الثالث :يطلب مسح ملف ndk-bundleمن المجلد Local؛ داخل AddData؛ والموجود داخل
ملف users؛ على الجهاز .النه يتعارض مع متطلبات التطبيق.
174
د /رشا صابر نوفل تطبيقات األندر ويد باستخدام ArcGIS Runtime SDK الفصل السادس عشر
عند الـ Type؛يتم تغيير خريطة األساس؛ على النحو الموضح أدناه .
175
رشا صابر نوفل/د ArcGIS Runtime SDK تطبيقات األندر ويد باستخدام الفصل السادس عشر
30°55و30°27'50إلضافة نقطة على التطبيق؛ بإحداثيات النقاط ؛ فمثال أريد وضع موقع مدينة منوف
.MainActivity Java يتم إضافة النقطة بالكود التالى في نافذة
ArcGISMap myMap = new
ArcGISMap(Basemap.createNationalGeographic());
Viewpoint myViewpoint = new
Viewpoint(30.27,30.55,200000);
myMap.setInitialViewpoint(myViewpoint);
176
رشا صابر نوفل/د ArcGIS Runtime SDK تطبيقات األندر ويد باستخدام الفصل السادس عشر
On Touch Listener:
177
د /رشا صابر نوفل تطبيقات األندر ويد باستخدام ArcGIS Runtime SDK الفصل السادس عشر
178
رشا صابر نوفل/د ArcGIS Runtime SDK تطبيقات األندر ويد باستخدام الفصل السادس عشر
179
د /رشا صابر نوفل تطبيقات األندر ويد باستخدام ArcGIS Runtime SDK الفصل السادس عشر
180
د /رشا صابر نوفل تطبيقات األندر ويد باستخدام ArcGIS Runtime SDK الفصل السادس عشر
181
رشا صابر نوفل/د ArcGIS Runtime SDK تطبيقات األندر ويد باستخدام الفصل السادس عشر
.SynceNow ثم-
: التاليةpermission ؛ يتم وضعmanifests وفى-
<uses-permission android:name="android.permission.INTERNET"
/>
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission
android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-feature android:glEsVersion="0x00020000"
android:required="true" />
<com.esri.arcgisruntime.mapping.view.SceneView
android:id="@+id/map1"android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"/>
182
رشا صابر نوفل/د ArcGIS Runtime SDK تطبيقات األندر ويد باستخدام الفصل السادس عشر
183
د /رشا صابر نوفل تطبيقات األندر ويد باستخدام ArcGIS Runtime SDK الفصل السادس عشر
184
د /رشا صابر نوفل تطبيقات األندر ويد باستخدام ArcGIS Runtime SDK الفصل السادس عشر
Camera
185
رشا صابر نوفل/د ArcGIS Runtime SDK تطبيقات األندر ويد باستخدام الفصل السادس عشر
186
د /رشا صابر نوفل تطبيقات األندر ويد باستخدام ArcGIS Runtime SDK الفصل السادس عشر
عمل تسجيل دخول الى Arc gis on lineمن برنامج االرك GISديسك توب من fileواختار Sine
inوتسجيل الدخول ثم عمل Shareمرة أخرى وأختار من النافذة التالية hostالخاص بى على االرك
اونالين.
187
د /رشا صابر نوفل تطبيقات األندر ويد باستخدام ArcGIS Runtime SDK الفصل السادس عشر
لو اردنا عمل تعديل على البيانات ؛ على االونالين يتم اختيار feature Access
188
د /رشا صابر نوفل تطبيقات األندر ويد باستخدام ArcGIS Runtime SDK الفصل السادس عشر
الخطأ األول يطلب إضافة Tag؛ فيتم وضع add tagفي خانة Tags؛ ثم الضغط على Analyze؛
والذهاب الى الخطأ الثاني والضغط عليه دبل كليك ؛ يطلب وضع وصف فيتم وضعه ثم الضغط على
Analyzeوفى النهاية يتم الضغط على .Publish
الدخول على االرك اونالين ؛ على Contant؛ أفتح المشروع المراد رفعه على التطبيق ؛ أسفل الشاشة
نجد رابط URL؛ الخاص بالمشروع
يتم نسخ الرابط ؛ ولصقه في متصفح الانترنت ؛ والدخول على الرابط ؛ نجد الطبقات الخاصة بنا ؛
189
رشا صابر نوفل/د ArcGIS Runtime SDK تطبيقات األندر ويد باستخدام الفصل السادس عشر
للخريطة ويتم إضافة بعض التعديالت واالكواد3D أو2D على نفس اعدادات السابقة ؛ سواء العرض
Main Activity Java التالية على واجهة
private MapView mvMapView;
private ArcGISMap mvMap;
private ServiceFeatureTable mvServiceFeatureTable ;
private FeatureLayer mvFeatureLayer;
private String
featureLayerUrl="https://services8.arcgis.com/c9p1i7LVL
mrhn2tm/ArcGIS/rest/services/%d8%a7%d8%b3%d8%aa%d8%ae%d
8%af%d8%a7%d9%85%d8%a7%d8%aa/FeatureServer/0";
190
رشا صابر نوفل/د ArcGIS Runtime SDK تطبيقات األندر ويد باستخدام الفصل السادس عشر
191
د /رشا صابر نوفل تطبيقات األندر ويد باستخدام ArcGIS Runtime SDK الفصل السادس عشر
192
د /رشا صابر نوفل تطبيقات األندر ويد باستخدام ArcGIS Runtime SDK الفصل السادس عشر
بعد إضافة االعدادات األساسية الخاصة بمجلد Buildgradleواضافة الـ prmissionفي مجلد
manifestو MainActivity Javaكما سبق وأن ذكرنا في اعدادت إضافة خريطة األساس ؛ يتم تغيير
عرض الLay outالى Linear؛ ثم نعطى احجام للخريطة ولباقى أجزاء الشاشة حيث يتم تقسيم الشاشة الى
جزئيين جزء علوى للمهام وجزء أسفل للخريطة
193
د /رشا صابر نوفل تطبيقات األندر ويد باستخدام ArcGIS Runtime SDK الفصل السادس عشر
يتم إضافة باقى عناصر المطلوبة للتصميم ؛ فنحتاج جزء خاص بالمهام فيتم تقسيم التصميم كيفما شئت ؛
وفيمال يلى توضيح ما قمت به في المثال ؛ تم إضافة Edit Text؛ Button
بعد ذلك يتم وضع List View؛ واضافة الخريطة كما موضح
194
د /رشا صابر نوفل تطبيقات األندر ويد باستخدام ArcGIS Runtime SDK الفصل السادس عشر
195
د /رشا صابر نوفل تطبيقات األندر ويد باستخدام ArcGIS Runtime SDK الفصل السادس عشر
بعد ذلك يتم عمل متغيرات داخل مجلد MainActivity.Javaلهذه العناصر؛ واعدادات المتغيرات على
النحو التالى ؛
}
;)}
196
د /رشا صابر نوفل تطبيقات األندر ويد باستخدام ArcGIS Runtime SDK الفصل السادس عشر
بعد ذلك يتبقى لنا قائمة عرض المهام والتي تستخدم بالضغط عليها فيتم عمل مصفوفة
197
د /رشا صابر نوفل تطبيقات األندر ويد باستخدام ArcGIS Runtime SDK الفصل السادس عشر
198
د /رشا صابر نوفل تطبيقات األندر ويد باستخدام ArcGIS Runtime SDK الفصل السادس عشر
لكن الحظنا انه اذا تم كتابة خطأ ال يمكننا مسح الـ taskوالمكانية حذف الـ task
199
رشا صابر نوفل/د ArcGIS Runtime SDK تطبيقات األندر ويد باستخدام الفصل السادس عشر
واضافة؛
mLocationDisplay.addDataSourceStatusChangedListener
(dataSourceStatusChangedEvent -> {
if (dataSourceStatusChangedEvent.isStarted
() || dataSourceStatusChangedEvent.getError () == null)
{
return;
}
int requestPermissionCode = 2;
String[] requestPermissions = new
String[]{Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION};
if (!(ContextCompat.checkSelfPermission
(MainActivity.this, requestPermissions[0]) ==
PackageManager.PERMISSION_GRANTED
200
رشا صابر نوفل/د ArcGIS Runtime SDK تطبيقات األندر ويد باستخدام الفصل السادس عشر
&&
ContextCompat.checkSelfPermission (MainActivity.this,
requestPermissions[1]) ==
PackageManager.PERMISSION_GRANTED)) {
ActivityCompat.requestPermissions
(MainActivity.this, requestPermissions,
requestPermissionCode);
} else {
String message = String.format ("Error
in DataSourceStatusChangedListener:%s",
dataSourceStatusChangedEvent.getSource
().getLocationDataSource ().getError ().getMessage ());
Toast.makeText (MainActivity.this,
message, Toast.LENGTH_LONG).show ();
}
});
mLocationDisplay.setAutoPanMode
(LocationDisplay.AutoPanMode.COMPASS_NAVIGATION);
mLocationDisplay.startAsync ();
}
201
رشا صابر نوفل/د ArcGIS Runtime SDK تطبيقات األندر ويد باستخدام الفصل السادس عشر
}
@Override
protected void onResume(){
super.onResume ();
mvMapView.resume ();
}
}
import ؛ تم البحث عن الخطأ ؛ فوجدنا ضرورة عملPermission نجد وجود خطأ على كلمة
import android.Manifest;
وحذف
import java.util.jar.Manifest;
ActivityMain
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:orientation="vertical"
android:weightSum="10"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
202
رشا صابر نوفل/د ArcGIS Runtime SDK تطبيقات األندر ويد باستخدام الفصل السادس عشر
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<LinearLayout
android:weightSum="10"
android:orientation="horizontal"
android:layout_weight="9"
android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:id="@+id/mvEditText"
android:layout_weight="2"
android:layout_width="match_parent"
android:layout_height="match_parent">
</EditText>
<Button
android:id="@+id/mvButton"
android:layout_weight="8"
android:text="Add Task"
android:layout_width="match_parent"
android:layout_height="match_parent">
</Button>
</LinearLayout>
<LinearLayout
android:weightSum="10"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1">
<ListView
android:id="@+id/mvListView"
android:layout_width="match_parent"
android:layout_height="330dp"
android:layout_weight="5">
</ListView>
<com.esri.arcgisruntime.mapping.view.MapView
android:id="@+id/mvMapView"
android:layout_width="match_parent"
android:layout_height="313dp"
203
رشا صابر نوفل/د ArcGIS Runtime SDK تطبيقات األندر ويد باستخدام الفصل السادس عشر
android:layout_weight="5">
</com.esri.arcgisruntime.mapping.view.MapView>
</LinearLayout>
</LinearLayout>
Activity java
package com.example.map5_task;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;
import com.esri.arcgisruntime.mapping.ArcGISMap;
import com.esri.arcgisruntime.mapping.Basemap;
import com.esri.arcgisruntime.mapping.view.LocationDisplay;
import com.esri.arcgisruntime.mapping.view.MapView;
import java.sql.Array;
import java.util.ArrayList;
import android.Manifest;
204
رشا صابر نوفل/د ArcGIS Runtime SDK تطبيقات األندر ويد باستخدام الفصل السادس عشر
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_main);
mvEditText = findViewById (R.id.mvEditText);
mvListView = findViewById (R.id.mvListView);
mvMapView = findViewById (R.id.mvMapView);
mvButton = findViewById (R.id.mvButton);
});
deletTask ();
205
رشا صابر نوفل/د ArcGIS Runtime SDK تطبيقات األندر ويد باستخدام الفصل السادس عشر
return true;
}
});
}
mLocationDisplay.addDataSourceStatusChangedListener
(dataSourceStatusChangedEvent -> {
if (dataSourceStatusChangedEvent.isStarted () ||
dataSourceStatusChangedEvent.getError () == null) {
return;
}
int requestPermissionCode = 2;
String[] requestPermissions = new
String[]{Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION};
if (!(ContextCompat.checkSelfPermission
(MainActivity.this, requestPermissions[0]) ==
PackageManager.PERMISSION_GRANTED
&& ContextCompat.checkSelfPermission
(MainActivity.this, requestPermissions[1]) ==
PackageManager.PERMISSION_GRANTED)) {
ActivityCompat.requestPermissions
(MainActivity.this, requestPermissions, requestPermissionCode);
} else {
String message = String.format ("Error in
DataSourceStatusChangedListener:%s",
dataSourceStatusChangedEvent.getSource
().getLocationDataSource ().getError ().getMessage ());
Toast.makeText (MainActivity.this, message,
Toast.LENGTH_LONG).show ();
}
});
mLocationDisplay.setAutoPanMode
(LocationDisplay.AutoPanMode.COMPASS_NAVIGATION);
mLocationDisplay.startAsync ();
}
206
رشا صابر نوفل/د ArcGIS Runtime SDK تطبيقات األندر ويد باستخدام الفصل السادس عشر
Toast.makeText (MainActivity.this,getResources
().getString
(R.string.location_permission_denied),Toast.LENGTH_LONG).show
();
}
}
@Override
protected void onPause(){
mvMapView.pause ();
super.onPause ();
}
@Override
protected void onResume(){
super.onResume ();
mvMapView.resume ();
}
:Mainfests
207
رشا صابر نوفل/د ArcGIS Runtime SDK تطبيقات األندر ويد باستخدام الفصل السادس عشر
android:theme="@style/Theme.Map5_task">
<activity android:name=".MainActivity">
<intent-filter>
<action
android:name="android.intent.action.MAIN" />
<category
android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
:Strings
<resources>
<string name="app_name">map5_task</string>
<string name="location_permission_denied"> User denied
permission for device location</string>
</resources>
؛ وال داعى للصقها النها تكرار للدروسBuild gradle مع األخذ في االعتبار األعدادت على مجلدات
. السابقة
208
د /رشا صابر نوفل انشاء تطبيق للحصول على بيانات الطقس الفصل السابع عشر
فى هذا الفصل يتم انشاء تطبيق يستخدم للحصول على بيانات الطقس ليتم تطبيق معظم األساسيات التي
تعلمناها فى األجزاء السابقة من الكتاب ويستخدم موقع openweathermapللحصول على البيانات ؛ وفيما
يلى شرح كيفية انشاء هذا التطبيق ؛
يتم عمل حساب على الموقع ومن ثم تسجيل الدخول الى الموقع ؛ والدخول الى APIنجد المفتاح الخاص
بناP
1
209
رشا صابر نوفل/د انشاء تطبيق للحصول على بيانات الطقس الفصل السابع عشر
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="Weather Applcation"
android:textColor="@color/white"
android:textSize="40dp" />
<LinearLayout
android:layout_width="match_parent"
210
رشا صابر نوفل/د انشاء تطبيق للحصول على بيانات الطقس الفصل السابع عشر
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:id="@+id/etCity"
android:ems="10"
android:hint="Enter City Name"
android:inputType="textPersonName" />
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:ems="10"
android:id="@+id/etCountry"
android:hint="Enter Country Code (Optional)"
android:inputType="textPersonName" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/btnGet"
android:layout_marginBottom="10dp"
android:background="#0070c7"
android:onClick="getWeatherDetails"
android:text="Get"
android:textColor="@color/white"
app:backgroundTint="@null" />
<ScrollView
android:layout_width="match_parent"
android:layout_height="150dp">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/tvResult"/>
</ScrollView>
</LinearLayout>
</LinearLayout>
211
د /رشا صابر نوفل انشاء تطبيق للحصول على بيانات الطقس الفصل السابع عشر
الكود:
212
د /رشا صابر نوفل انشاء تطبيق للحصول على بيانات الطقس الفصل السابع عشر
213
رشا صابر نوفل/د انشاء تطبيق للحصول على بيانات الطقس الفصل السابع عشر
214
رشا صابر نوفل/د انشاء تطبيق للحصول على بيانات الطقس الفصل السابع عشر
الطقس
DecimalFormat df = new DecimalFormat ("#.##");
ثم
etCity = findViewById (R.id.etCity);
etCountry = findViewById (R.id.etCountry);
tvResult = findViewById (R.id.tvResult);
215
رشا صابر نوفل/د انشاء تطبيق للحصول على بيانات الطقس الفصل السابع عشر
ثم كتابة
StringRequest stringRequest = new StringRequest
(Request.Method.POST, temPUR1, new Response.Listener<String> ()
{
@Override
public void onResponse(String response) {
Log.d ("response", response);
}
},new Response.ErrorListener (){
@Override
public void onErrorResponse(VolleyError error) {
216
د /رشا صابر نوفل انشاء تطبيق للحصول على بيانات الطقس الفصل السابع عشر
217
د /رشا صابر نوفل انشاء تطبيق للحصول على بيانات الطقس الفصل السابع عشر
ثم نقوم بعمل ملف تأمين الشبكة نأتى على مجلد res
ثم
218
د /رشا صابر نوفل انشاء تطبيق للحصول على بيانات الطقس الفصل السابع عشر
219
رشا صابر نوفل/د انشاء تطبيق للحصول على بيانات الطقس الفصل السابع عشر
220
د /رشا صابر نوفل انشاء تطبيق للحصول على بيانات الطقس الفصل السابع عشر
ثم كتابة
221
رشا صابر نوفل/د انشاء تطبيق للحصول على بيانات الطقس الفصل السابع عشر
222
رشا صابر نوفل/د انشاء تطبيق للحصول على بيانات الطقس الفصل السابع عشر
countryName + ")"
+ "\n Temp : " + df.format (temp) + " °C "
+ "\n Fells Like : " + df.format (feelslike) + "°C
"
+"\n Humidity : "+ humidity + "%"
+"\n Description : " + description
+ "\n Wind Speed : " + wind + "m/s (meters per
second)"
+ "\n Cloudiness : " + clouds + "%"
+ "\n pressure : " + pressure + "hpa";
tvResult.setText (OutPut);
223
رشا صابر نوفل/د انشاء تطبيق للحصول على بيانات الطقس الفصل السابع عشر
import androidx.appcompat.app.AppCompatActivity;
import android.graphics.Color;
import android.os.Bundle;
import android.provider.CalendarContract;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.text.DecimalFormat;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_main);
etCity = findViewById (R.id.etCity);
etCountry = findViewById (R.id.etCountry);
tvResult = findViewById (R.id.tvResult);
}
224
رشا صابر نوفل/د انشاء تطبيق للحصول على بيانات الطقس الفصل السابع عشر
}
StringRequest stringRequest = new StringRequest
(Request.Method.POST, temPUR1, new Response.Listener<String> ()
{
@Override
public void onResponse(String response) {
//Log.d ("response", response);
String OutPut= "";
try {
JSONObject jsonResponse = new JSONObject
(response);
JSONArray jsonArray =
jsonResponse.getJSONArray ("weather");
JSONObject jsonObjectWeather =
jsonArray.getJSONObject (0);
String description =
jsonObjectWeather.getString ("description");
JSONObject jsonObjectMain =
jsonResponse.getJSONObject ("main");
double temp = jsonObjectMain.getDouble
("temp") - 237.15;
double feelslike =
jsonObjectMain.getDouble ("feels_like") - 237.15;
float pressure = jsonObjectMain.getInt
("pressure");
int humidity = jsonObjectMain.getInt
("humidity");
JSONObject jsonObjectWind =
jsonResponse.getJSONObject ("wind");
String wind = jsonObjectWind.getString
("speed");
JSONObject jsonObjectClouds =
jsonResponse.getJSONObject ("clouds");
225
رشا صابر نوفل/د انشاء تطبيق للحصول على بيانات الطقس الفصل السابع عشر
String clouds =
jsonObjectClouds.getString ("all");
JSONObject jsonObjectSys =
jsonResponse.getJSONObject ("sys");
String countryName =
jsonObjectSys.getString ("country");
String cityName = jsonResponse.getString
("name");
tvResult.setTextColor (Color.rgb
(68,134,199));
OutPut += "Current weather of " +
cityName + "(" + countryName + ")"
+ "\n Temp : " + df.format
(temp) + " °C "
+ "\n Fells Like : " + df.format
(feelslike) + "°C "
+"\n Humidity : "+ humidity +
"%"
+"\n Description : " +
description
+ "\n Wind Speed : " + wind +
"m/s (meters per second)"
+ "\n Cloudiness : " + clouds +
"%"
+ "\n pressure : " + pressure +
"hpa";
tvResult.setText (OutPut);
} catch (JSONException e) {
e.printStackTrace ();
}
}
},new Response.ErrorListener (){
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText (getApplicationContext
(),error.toString ().trim (),Toast.LENGTH_LONG).show ();
}
});
RequestQueue requestQueue = Volley.newRequestQueue
(getApplicationContext ());
requestQueue.add (stringRequest);
}
}
}
226
د /رشا صابر نوفل انشاء تطبيق للحصول على بيانات الطقس الفصل السابع عشر
227
رشا صابر نوفل/د انشاء تطبيق للحصول على بيانات الطقس الفصل السابع عشر
Activitymain مجلد
android:padding="16dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="Weather Applcation"
android:textColor="@color/purple_700"
android:textSize="35dp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:id="@+id/etCity"
android:ems="10"
android:hint="Enter City Name"
android:inputType="textPersonName" />
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
228
رشا صابر نوفل/د انشاء تطبيق للحصول على بيانات الطقس الفصل السابع عشر
android:layout_marginBottom="10dp"
android:ems="10"
android:id="@+id/etCountry"
android:hint="Enter Country Code (Optional)"
android:inputType="textPersonName" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/btnGet"
android:layout_marginBottom="10dp"
android:background="#0070c7"
android:onClick="getWeatherDetails"
android:text="Get"
android:textColor="@color/white"
app:backgroundTint="@null" />
<ScrollView
android:layout_width="match_parent"
android:layout_height="150dp">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/tvResult"/>
</ScrollView>
</LinearLayout>
</LinearLayout>
229
د /رشا صابر نوفل قائمة املراجع واملصادر بناء تطبيقات االندرويد يف نظم املعلومات اجلغرافية
.1إبراهيم؛ محمد محمود ؛ أساسيات البرمجة بلغة الجافا الجزء األول .2019
.2أحمد ؛ عادل مبارك ؛ تطوير تطبيقات أندرويد .2013
.3األغا ؛ إياد محمد قاسم ؛ أساسيات برمجة تطبيقات األندرويد ؛ . 2018
.4الضبى ؛ سعد ؛ تعلم الجافا ببساطة ؛ مكتبة نور؛ .2017
.5رحمة إمام ؛ االندرويد ستوديو بالعربي خطوة بخطوة ؛. 2019
.6عبد المجيد ؛ محمد الجيالني ؛ سلسلة تعليم تصميم وتطوير تطبيقات أندرويد ؛.2012
.7عزب؛ محمد عزب ؛ برمجة أندرويد ( المهام المتقدمة)؛ .2013
.8غازى ؛ عميد صالح ؛ البرمجة باستخدام لغة الجافا ؛ .2015
.9مساعد ؛ أحمد عباس محمد ؛ برمجة واجهات المستخدم فى لغة الجافا .2011
وائل علواني -محمد بدوي ؛ تعلم تطوير التطبيقات على أجهزة أندرويد ببساطة ؛.2018 .10
1- Andy Gup , Building Applications with the ArcGIS Runtime SDK for Android , Esri ,2013.
2- Antonio Remírez Remírez , Introducción a ArcGIS Runtime for Android , 2015.
3- Jay Chen, Justin Colville, Developing Mapping Applications with ArcGIS Runtime SDK for
Windows Mobile,Esri , 2013.
4- Rama Chintapalli, ArcGIS Runtime SDK for Android Building App , Esri, 2020.
230
رشا صابر نوفل/د قائمة املراجع واملصادر بناء تطبيقات االندرويد يف نظم املعلومات اجلغرافية
: مصادر من األنترنت-:ًثالثا
:المواقع
1- https://harmash.com/java.
2- https://www.codecademy.com/learn/learn-java.
3- https://www.javacodegeeks.com/.
:قنوات من اليوتيوب
4-
5- https://www.youtube.com/channel/UCgntwWFdMDPq0eNhaQ0LHIQ
6- https://www.youtube.com/channel/UCBNZ0VoN2u_4NT8kbmGgUzQ
7- https://www.youtube.com/channel/UCgCXcfk5uEraWkpE9wlRwgw
8- https://www.youtube.com/channel/UCgCXcfk5uEraWkpE9wlRwgw
231
رشا صابر نوفل/د بناء تطبيقات االندرويد يف نظم املعلومات اجلغرافية
1
2020/2022