مقدمة: لماذا نستدعي Activity من تطبيق آخر؟
\n\nتخيل أنك تقوم بإنشاء تطبيق للملاحظات، وتريد منح المستخدم القدرة على التقاط صورة مباشرة من واجهتك. أو لنفترض أن تطبيق المراسلة الخاص بك يحتاج إلى فتح جهات الاتصال من دفتر العناوين. في كلتا الحالتين، تحتاج إلى تشغيل Activity من تطبيق آخر في Android.
\n\nهذه المهمة هي واحدة من أكثر الأسئلة شيوعًا على Stack Overflow (آلاف المشاهدات ومئات الأصوات). وليس من دون سبب: إذا قمت بذلك بشكل غير صحيح، فقد يتعطل التطبيق مع ActivityNotFoundException أو، ما هو أسوأ، قد يشكل تهديدًا أمنيًا. في هذا الدليل، سنشرح جميع التفاصيل الدقيقة بلغة Kotlin، حتى تتمكن من دمج الشاشات الخارجية في مشاريعك بثقة.
بالمناسبة، أنت على موقع PythonLib، حيث نتحدث غالبًا عن Python، لكن اليوم حالة خاصة. تطوير Android باستخدام Kotlin هو مهارة قوية تتكامل بشكل رائع مع الواجهة الخلفية بلغة Python. هيا بنا!
\n\nما هو Intent ولماذا هو المفتاح للحل؟
\n\nفي Android، Intent هو رسالة تخبر النظام: "مرحبًا، أحتاج إلى القيام بشيء ما بهذا الإجراء". لـ تشغيل Activity من تطبيق آخر، يتم استخدام طريقتين:
\n\n- \n
- Intent صريح — تعرف بالضبط المكون الذي تريد تشغيله (مثل
com.example.target.MainActivity). يعمل فقط إذا كان لديك حق الوصول إلى كود هذا التطبيق. \n - Intent ضمني — تصف ما تريد القيام به (مثل "فتح الخريطة بالإحداثيات")، ويقوم النظام نفسه بالعثور على التطبيق المناسب. هذه طريقة أكثر مرونة وأمانًا لـ استدعاء Activity خارجي. \n
سنركز على Intents الضمنية، حيث يتم استخدامها غالبًا لـ التفاعل بين العمليات في Android.
\n\nمثال أساسي: فتح الخريطة بالإحداثيات
\n\nلنبدأ بمثال بسيط يوضح كيفية تشغيل Activity من تطبيق آخر لعرض خريطة.
\n\n// Kotlin\nval gmmIntentUri = Uri.parse("geo:55.7558,37.6173?z=15")\nval mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri)\nmapIntent.setPackage("com.google.android.apps.maps")\n\n// نتحقق مما إذا كان هناك تطبيق يمكنه معالجة Intent\nif (mapIntent.resolveActivity(packageManager) != null) {\n startActivity(mapIntent)\n} else {\n // نعرض رسالة خطأ للمستخدم\n Toast.makeText(this, "خرائط Google غير مثبتة", Toast.LENGTH_SHORT).show()\n}\n\nماذا يحدث هنا؟ نقوم بإنشاء Intent مع إجراء ACTION_VIEW وURI يحتوي على الإحداثيات. ثم باستخدام setPackage، نحدد صراحة أننا نريد استخدام خرائط Google (على الرغم من أن هذا ليس إلزاميًا — يمكن للنظام تقديم خيار). الأهم هو التحقق عبر resolveActivity. هذا يحمي من تعطل التطبيق إذا كان التطبيق المطلوب غير موجود على الجهاز.
سيناريو: استدعاء الكاميرا والحصول على النتيجة
\n\nالآن ننتقل إلى حالة أكثر تعقيدًا — تشغيل Activity من تطبيق آخر مع انتظار النتيجة. مثال كلاسيكي: التقاط صورة والحصول عليها في تطبيقك.
\n\n// Kotlin\nprivate const val REQUEST_IMAGE_CAPTURE = 1\n\nprivate fun dispatchTakePictureIntent() {\n val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)\n // نتحقق من أن الكاميرا متاحة\n if (takePictureIntent.resolveActivity(packageManager) != null) {\n startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE)\n } else {\n // معالجة الخطأ: الكاميرا غير موجودة\n }\n}\n\noverride fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {\n super.onActivityResult(requestCode, resultCode, data)\n if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == Activity.RESULT_OK) {\n val imageBitmap = data?