פיתוח Share Extension לאנדרואיד (Share Sheet)
המשתמש מקיש על "שיתוף", אבל האפליקציה שלך לא מופיעה ברשימה. או שהיא מופיעה אבל קורסת עם SecurityException. נשמע מוכר? סיבות אופייניות הן intent-filter שגוי או טיפול חסר ב-ContentResolver. נעבור על בניית Share Extension אמין שמקבל נכון כל סוג תוכן — מטקסט ועד וידאו — ומתאים אישית את השיתוף באמצעות Direct Share.
באנדרואיד 10+, מודל הגישה לקבצים השתנה: לא ניתן לקבל את נתיב הקובץ הישיר. כל URI של content:// דורש הרשאת גישה זמנית שתקפה רק במהלך מחזור החיים של ה-Activity. התעלמות מכך מובילה לקריסות באנדרואיד 11 ומעלה. נראה לך כיצד להימנע משגיאות אלו ולהבטיח טיפול יציב בתוכן בכל הגרסאות הנוכחיות.
הפתרון שלנו כולל דפוסים מוכחים: intent-filters נפרדים לכל סוג MIME, העתקת קבצים בטוחה דרך ContentResolver, ו-Direct Share מותאם אישית להגברת המרות. תקבל קוד מוכן לשימוש שנבדק על אנדרואיד 10–14. זה חוסך זמן ניפוי שגיאות ומבטיח תאימות.
כיצד להגדיר intent-filter עבור מספר סוגי MIME?
הטעות העיקרית היא שימוש בפילטר אחד לכל דבר. מערכת האנדרואיד מטפלת בצורה גרועה במספר תגי <data> בתוך <intent-filter> אחד. הגישה הנכונה: צור פילטרים נפרדים עבור text/plain, image/*, video/*, application/octet-stream. דוגמה:
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="image/*" />
</intent-filter>עבור <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="text/plain" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="image/*" /> </intent-filter> , הוסף פילטרים מקבילים. זה מבטיח שהאפליקציה שלך תופיע ב-Chooser עבור כל סוג.
כיצד לטפל ב-URI ללא אובדן נתונים?
ה-SEND_MULTIPLE מ-Uri חי רק במהלך ה-Activity (אלא אם נלקח Intent.EXTRA_STREAM). קרא אותו דרך persistedUriPermission — לעולם לא דרך ContentResolver.openInputStream(). אנו מעתיקים את הקובץ ל-File() מיד:
val inputStream = contentResolver.openInputStream(sourceUri)
val destFile = File(cacheDir, "shared_${System.currentTimeMillis()}.jpg")
inputStream?.use { it.copyTo(destFile.outputStream()) }זה הופך את הקובץ לזמין גם לאחר שה-Activity מסתיים. באנדרואיד 10+, גישה ישירה ל-cacheDir חסומה, ולכן דפוס זה הוא חובה.
מדוע Direct Share מגביר המרות?
Direct Share מציג נמענים מותאמים אישית ישירות ב-Share Sheet של המערכת. לפי בדיקות A/B, שיעורי ההמרה גבוהים פי 2–3 בהשוואה ל-Chooser הבסיסי. הטמע אותו באמצעות val inputStream = contentResolver.openInputStream(sourceUri) val destFile = File(cacheDir, "shared_${System.currentTimeMillis()}.jpg") inputStream?.use { it.copyTo(destFile.outputStream()) } עם הקטגוריה /data/:
val shortcut = ShortcutInfoCompat.Builder(context, "chat_anna")
.setShortLabel("Анна")
.setLongLived(true)
.setCategories(setOf(ShortcutInfoCompat.SHORTCUT_CATEGORY_CONVERSATION))
.setIntent(Intent(context, ChatActivity::class.java).apply {
putExtra("user_id", 42)
})
.build()
ShortcutManagerCompat.pushDynamicShortcut(context, shortcut)זו משימה נוספת: יש לעדכן קיצורי דרך, לעדכן תמונות פרופיל ולהגיב לשינויים באנשי קשר. אבל התוצאה שווה את זה.
השוואת גישות
| מאפיין | Share בסיסי | עם Direct Share |
|---|---|---|
| זמן פיתוח | 2–3 שבועות | 4–6 שבועות |
| המרת שיתוף | סטנדרטי | +150% |
| טיפול בקבצים | מקוון בלבד | סנכרון רקע |
| התאמה אישית | לא | כן, עם תמונות פרופיל |
| מורכבות אינטגרציה | נמוכה | בינונית |
בעיות אופייניות ופתרונותיהן
| בעיה | פתרון |
|---|---|
| האפליקציה לא מופיעה ב-Chooser | בדוק intent-filter: הפרד לפי סוגי MIME, הוסף SEND_MULTIPLE |
| SecurityException בעת פתיחת URI | השתמש ב-ContentResolver.openInputStream() במקום File() |
| אובדן נתונים בסיבוב מסך | שמור את הנתיב שהועתק ב-onSaveInstanceState |
| מחסנית חזרה שגויה | הגדר launchMode="singleTask" ו-taskAffinity מתאים |
רשימת בדיקה לבדיקת Share Extension
- בדוק שיתוף יחיד ומרובה של טקסט, תמונות, וידאו.
- בדוק על אנדרואיד 10, 12, 14 (אמולטור ומכשירים אמיתיים).
- ודא שהאפליקציה מופיעה ב-Chooser עבור כל סוגי היעד.
- בדוק Direct Share: אנשי קשר מותאמים אישית מוצגים.
- Symulate הפרעות (שיחה, סיבוב) לפני השלמת העיבוד.
מה כלול בעבודה
- ניתוח סוגי התוכן שהאפליקציה שלך צריכה לקבל.
- עיצוב intent-filter ו-(אופציונלי) ממשק בחירה.
- הטמעת Activity מקבל עם טיפול ב-URI והעתקת קבצים.
- הגדרת Direct Share עם קיצורי דרך מעודכנים.
- בדיקות על אנדרואיד 10–14 עם קבצים וטקסט אמיתיים.
- תיעוד לאינטגרציה ותמיכה בפריסה.
- חיסכון בזמן מפתרונות מוכנים.
תהליך העבודה
- ניתוח — אנו לומדים את סוגי התוכן שהאפליקציה שלך צריכה לקבל.
- עיצוב — אנו בוחרים את סכמת ה-intent-filter ומעצבים ממשק בחירה (אם נדרש).
- פיתוח — אנו כותבים את ה-Activity המקבל, מטפלים ב-URI ומיישמים העתקת קבצים.
- בדיקות — אנו מוודאים על אנדרואיד 10, 12, 14 עם קבצים וטקסט שונים.
- פריסה — אנו מפרסמים ל-Google Play ומגדירים את Google Play Console לקבלת קישורים.
לוח זמנים ועלות
נעריך את הפרויקט שלך תוך 1–2 ימים. הרחבה בסיסית מתחילה משבועיים. אינטגרציות מורכבות לוקחות עד 6 שבועות. העלות קבועה לאחר הסכמה על המפרט הטכני. יש לנו ניסיון של 5+ שנים בפיתוח אנדרואיד ויותר מ-20 Share Extensions מוצלחים. קבל פתרון סוהר עם תאימות מובטחת לאנדרואיד 10–14. הזמן פיתוח Share Extension עכשיו — התחל בייעוץ.
לפי מדריך המפתחים של אנדרואיד, לקבלת תוכן אמין, השתמש ב-intent-filters נפרדים לכל סוג MIME.
צור קשר כדי לדון בפרויקט שלך ולקבל הצעה מותאמת אישית.







