الحصول على نتيجة من نشاط

الإعلانات

الحصول على نتيجة من نشاط

 

الحصول على نتيجة من نشاط

البدء بنشاط آخر لا يجب أن يكون بإتجاه واحد. يمكنك أيضاً بدء نشاط آخر والحصول على نتيجة. و لتلقي نتيجة..

قم بإستدعاء ()startActivityForResult (بدلاً من ()startActivity).

مثال، يمكن لتطبيقك بدء تطبيق الكاميرا والحصول على الصورة الملتقطة كنتيجة.

أو يمكنك بدء تشغيل تطبيق الأشخاص حتى يتمكن المستخدم من تحديد جهة إتصال وستتلقى تفاصيل الإتصال كنتيجة.

بالطبع، النشاط الذي يستجيب يجب تصميمه ليقوم بإرجاع نتيجة. عند القيام بذلك، يرسل النتيجة ككائن غرض آخر.

يتلقاه نشاطك في الإستدعاء ()onActivityResult.

ملاحظة: يمكنك إستخدام الأغراض الصريحة أو الضمنية عند إستدعاء ()startActivityForResult . عند بدء أحد أنشطتك للحصول على نتيجة..

يجب عليك إستخدام غرض صريح لضمان حصولك على النتيجة المتوقعة.

 

 

 

 

بدأ النشاط


لا يوجد شيء خاص حول كائن الغرض الذي تستخدمه عند بدء نشاط لتلقي نتيجة، ولكنك تحتاج إلى تمرير “وسيط عدد صحيح” إضافي لدالة ()startActivityForResult.

وسيط العدد الصحيح عبارة عن “كود طلب” يحدد طلبك. عندما تتلقى نتيجة الغرض، يقوم الإستدعاء بتوفير نفس كود الطلب..

حتى يتمكن تطبيقك من تحديد النتيجة بشكلٍ صحيح وتحديد كيفية التعامل معها.

 

مثال، فيما يلي كيفية بدء نشاط يسمح للمستخدم بإختيار جهة إتصال:  الحصول على نتيجة من نشاط

KOTLIN

const val PICK_CONTACT_REQUEST = 1  // The request code
...
private fun pickContact() {
    Intent(Intent.ACTION_PICK, Uri.parse("content://contacts")).also { pickContactIntent ->
        pickContactIntent.type = Phone.CONTENT_TYPE // Show user only contacts w/ phone numbers
        startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST)
    }
}

 

JAVA

static final int PICK_CONTACT_REQUEST = 1;  // The request code
...
private void pickContact() {
    Intent pickContactIntent = new Intent(Intent.ACTION_PICK, Uri.parse("content://contacts"));
    pickContactIntent.setType(Phone.CONTENT_TYPE); // Show user only contacts w/ phone numbers
    startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST);
}

 

 

 

 

 

 

تلقي النتيجة


عندما ينتهي المستخدم من النشاط التالي ويعود، يقوم النظام بإستدعاء دالة ()onActivityResult الخاصة بنشاطك. تحتوي هذه الدالة على ثلاثة معطيات:

 

  •  كود النتيجة المحدد بواسطة النشاط الثاني. فهذا إما أن يكون RESULT_OK إذا كانت العملية ناجحة أو يكون RESULT_CANCELED إذا تراجع المستخدم أو فشلت العملية لسببٍ ما.

 

  •  غرض يحمل بيانات النتائج.

مثال، إليك كيفية التعامل مع نتيجة “إختيار جهة إتصال”:

KOTLIN

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
    // Check which request we're responding to
    if (requestCode == PICK_CONTACT_REQUEST) {
        // Make sure the request was successful
        if (resultCode == Activity.RESULT_OK) {
            // The user picked a contact.
            // The Intent's data Uri identifies which contact was selected.

            // Do something with the contact here (bigger example below)
        }
    }
}

 

JAVA

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // Check which request we're responding to
    if (requestCode == PICK_CONTACT_REQUEST) {
        // Make sure the request was successful
        if (resultCode == RESULT_OK) {
            // The user picked a contact.
            // The Intent's data Uri identifies which contact was selected.

            // Do something with the contact here (bigger example below)
        }
    }
}

 

 

في هذا المثال، غرض النتيجة الذي تم إرجاعه بواسطة جهات إتصال الأندرويد أو تطبيق الأشخاص الذي يوفر محتوى Uri يحدد الأسم الذي حدده المستخدم.

من أجل معالجة النتيجة بنجاح، يجب أن تفهم كيف سيكون شكل غرض النتيجة. يعد إجراء ذلك أمراً سهلاً عندما يكون النشاط..

الذي يرجع النتائج هو أحد الأنشطة الخاصة بك. تقدم التطبيقات المضمنة في نظام الأندرويد الأساسي واجهات برمجة التطبيقات الخاصة بها..

والتي يمكنك الإعتماد عليها لبيانات نتائج محددة. مثال، يعرض تطبيق “الأشخاص” دائماً نتيجة مع عنوان URI للمحتوى الذي يحدد جهة الإتصال المحددة..

ويعيد تطبيق الكاميرا صورة نقطية في “البيانات” الإضافية (راجع إلتقاط الصور).

 

 

 

 

 

إضافة: قراءة بيانات الإتصال

الكود أعلاه يوضح كيفية الحصول على نتيجة من تطبيق الأشخاص ر يدخل في تفاصيل كيفية قراءة البيانات من النتيجة..

نظراً لأنه يتطلب مناقشة أكثر تقدماً حول موفري المحتوى. مع ذلك، إن كنت فضولياً، فإليك بعض الأكواد الأخرى..

التي توضح كيفية الإستعلام عن بيانات النتائج للحصول على رقم الهاتف من جهة الإتصال المحددة:

KOTLIN

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
    // Check which request it is that we're responding to
    if (requestCode == PICK_CONTACT_REQUEST) {
        // Make sure the request was successful
        if (resultCode == Activity.RESULT_OK) {
            // We only need the NUMBER column, because there will be only one row in the result
            val projection: Array<String> = arrayOf(Phone.NUMBER)

            // Get the URI that points to the selected contact
            data.data?.also { contactUri ->
                // Perform the query on the contact to get the NUMBER column
                // We don't need a selection or sort order (there's only one result for this URI)
                // CAUTION: The query() method should be called from a separate thread to avoid
                // blocking your app's UI thread. (For simplicity of the sample, this code doesn't
                // do that.)
                // Consider using <code><a href="/reference/android/content/CursorLoader.html">CursorLoader</a></code> to perform the query.
                contentResolver.query(contactUri, projection, null, null, null)?.apply {
                    moveToFirst()

                    // Retrieve the phone number from the NUMBER column
                    val column: Int = getColumnIndex(Phone.NUMBER)
                    val number: String? = getString(column)

                    // Do something with the phone number...
                }
            }
        }
    }
}

JAVA

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent resultIntent) {
    // Check which request it is that we're responding to
    if (requestCode == PICK_CONTACT_REQUEST) {
        // Make sure the request was successful
        if (resultCode == RESULT_OK) {
            // Get the URI that points to the selected contact
            Uri contactUri = resultIntent.getData();
            // We only need the NUMBER column, because there will be only one row in the result
            String[] projection = {Phone.NUMBER};

            // Perform the query on the contact to get the NUMBER column
            // We don't need a selection or sort order (there's only one result for the given URI)
            // CAUTION: The query() method should be called from a separate thread to avoid blocking
            // your app's UI thread. (For simplicity of the sample, this code doesn't do that.)
            // Consider using <code><a href="/reference/android/content/CursorLoader.html">CursorLoader</a></code> to perform the query.
            Cursor cursor = getContentResolver()
                    .query(contactUri, projection, null, null, null);
            cursor.moveToFirst();

            // Retrieve the phone number from the NUMBER column
            int column = cursor.getColumnIndex(Phone.NUMBER);
            String number = cursor.getString(column);

            // Do something with the phone number...
        }
    }
}

 

 

ملاحظة: قبل أندرويد 2.3 (مستوى API 9)، يتطلب إجراء إستعلام على موفر جهات الإتصال (مثل الموضح أعلاه) أن يعلن تطبيقك عن إذن القراءة READ_CONTACTS (راجع الأمن والأذونات).

ومع ذلك، بدءاً من أندرويد 2.3 ، يمنح تطبيق جهات الإتصال / الأشخاص تطبيقك إذن مؤقته للقراءة من موفر جهات الإتصال عندما يقوم بإرجاع نتيجك.

ينطبق الإذن المؤقت فقط على جهة الإتصال المطلوبة، لذا لا يمكنك الإستعلام عن جهة إتصال أخرى غير تلك المحددة..

بواسطة Uri الخاص بالغرض، إلا إذا قمت بالإعلان عن إذن القراءة READ_CONTACTS.

للحصول على معلومات إضافية حول الموضوعات في هذه الصفحة، اقرأ المصادر التالية:

تبادل البيانات البسيطة
تبادل الملفات

 


للإطلاع على المقال باللغة الإنجليزية أضغط هنا.

الإعلانات

اترك رد