بسم الله الرحمن الرحيم
درس اليوم مفيد ومهم جداً .. في تلقي بيانات ( صور – نص – صور متعددة ) من تطبيقات أخرى, ليتم مشاركتها في تطبيقك والتصرف بها .. تعديل تكبير تحرير كلي .. يمكنك التصرف بها كما تريد. الدرس مهم للذين يريدون إنشاء تطبيقات تحرير, تعديل وتصميم صور, أو مشاركة النصوص لتوزيعها, نشرها .. إلخ.
في البداية الدرس بشكل كلي يعتمد على ما يسمى بـ Intent و هي من الأساسيات لنظام اندرويد. وأعتقد انها شرحت كثيراً في المدونة وصفحتنا على الفيس بوك. فهي النية أو القصد ولها أستخدامات كثيرة .. للتنقل بين تطبيقات أو بين واجهات من نفس التطبيق.
- أكثر من يستفيد من هذا الدرس لم يريد برمجة تطبيق اجتماعي وتفاعلي مع المستخدمين.
اولاً سوف نستخدم تصريحات الانتنت ACTION_SEND في داخل ملف AndroidManifest.xml بواسطة العنصر <intent-filter>.
<activity android:name=".MainActivity"> <!-- انتنت معالجة handling incoming للاستقبال النص --> <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="text/plain" /> </intent-filter> <!-- انتنت معالجة handling incoming للاستقبال الصورة --> <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="image/*" /> </intent-filter> <!-- انتنت معالجة handling incoming للاستقبال صور متعددة --> <intent-filter> <action android:name="android.intent.action.SEND_MULTIPLE" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="image/*" /> </intent-filter> </activity>
نحن سوف نستخدم فقط استقبال صورة + نص .. أما الصور المتعددة فهي اختيارية لك في حال أردت استخدامها.
وسوف نعطي تصاريح للتطبيق / قراءة + كتابة على الذاكرة SD من أجل حفظ الصورة.
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
* الان جانب التنسيق في ملف الواجهة Layout > تواصل معنا أشخاص يريدون منا الاهتمام بشكل أكبر بالتنسيق لذلك سوف نحاول قدر الإمكان …
نفتح ملف activity_main.xml ونضع فيه نص و صورة .. في حالة مشاركة نص للتطبيق سوف يتغير إلى النص الذي تم مشاركته وكذلك الصورة.
سوف أستخدم ScrollView من أجل النص, وسوف أعطي خاصية الوزن للنص وللصورة 50%.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:orientation="vertical" android:layout_height="match_parent" android:padding="20dp"> <ScrollView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="0.5" android:id="@+id/scrollView" > <TextView android:id="@+id/sentText" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="right" android:text="لا يوجد نص هنا قد تمت مشاركته" /> </ScrollView> <ImageView android:id="@+id/sentImage" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="0.5" android:layout_gravity="center" android:src="@drawable/no_image"> </ImageView> </LinearLayout>
الصورة المستخدمة no_image
معاينة للتنسيق :
الآن نذهب إلى الجزء البرمجي MainActivity.java // سوف نستخدم الانتنت كما ذكرنا سابقاً .. كذلك سوف نستخدم الدوال :
- hanlde incoming text data
- handle incoming Image
سوف أدرج لكم الكود وأضع عليه سطور التعليقات.
MainActivity.java
package com.andrody.first_app; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends Activity { // عرفنا متغيرات جديدة .. النص والصورة private ImageView imageView; private TextView textview; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // ربط المتغيرات بمعرفات id imageView = (ImageView) findViewById(R.id.sentImage); textview = (TextView)findViewById(R.id.sentText); // الحصول على الانتنت في بداية تشغيل التطبيق Intent intent = getIntent(); // الحصول على الاكشن لهذا الانتنت String action = intent.getAction(); // الحصول على نوع هذا الاكشن هل هو صورة أو نص String type = intent.getType(); // تطبيق الاكشن ارسال اذا كان النوع غير مجهول if (Intent.ACTION_SEND.equals(action) && type != null) { // إذا كان النوع هو نص نفذ التالي if ("text/plain".equals(type)) { handleSendText(intent); // التعامل مع النص } else if (type.startsWith("image/")) { // اما اذا كان النوع هو صورة handleSendImage(intent); // التعامل مع الصورة التي أتت } } } // هذه الدالة التي تنفذ عندما يأتي نص من تطبيق آخر private void handleSendText(Intent intent) { // الحصول على النص من الانتنت String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT); // اذا كان النص غير فاسد if (sharedText != null) { // اعرض النص في textview textview.setText(sharedText); } } // هذه الدالة التي تنفذ عندما تأتي صورة من تطبيق آخر private void handleSendImage(Intent intent) { // الحصول على رابط الصورة من الانتنت Uri imageUri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM); // إذا كان رابط الصورة غير فاسد if (imageUri != null) { // اعرض الصورة التي أتت في imageView imageView.setImageURI(imageUri); } else{ // إذا كان الرابط باطل فإظهر رسالة توست تخبرنا بذلك Toast.makeText(this, "حدث خطأ، URI غير صالح", Toast.LENGTH_LONG).show(); } } }
أرجوا أن يكون كل شيء مفهوم فالأمر بسيط إن شاء الله ..
معاينة من تطبيق اليوم : ( انقر على الصورة لتكبيرها )
نرجوا مشاركة المواضيع ونشرها لتعم الفائدة .. وانتظرونا بكل جديد ومفيد وحصري .. والسلام عليكم 🙂