דוגמה בסיסית

בקטע הזה נסביר איך ליצור שיחת שלום חוצת-פרופילים ב- באפליקציה שלך. כך תוכלו להכיר את ה-SDK ולקבל עזרה שעליו אנחנו מבססים. מומלץ לעקוב אחרי הפעילות באופן פעיל על ידי פיתוח האפליקציה שלכם.

הגדרת מכשיר בדיקה עם פרופיל עבודה

Google מפתחת את אפליקציית DPC לבדיקה כדי לעזור לך לדמות ולבדוק במכשיר עצמו. הוא יגדיר פרופיל עבודה ויספק לך עם פקדים להפעלה או להשבתה של תכונות מסוימות במכשיר.

  • מתקינים את האפליקציה Test DPC

    פותחים את חנות Google Play ומורידים את האפליקציה לבדיקת בקר DPC.

  • הגדרה של פרופיל עבודה

    אחת האפליקציה שמותקנת במכשיר, אתם אמורים לראות שני סמלים מופיעים במכשיר: ואת סמל האפליקציה 'בדיקת DPC'. מקישים על סמל ההגדרה ופועלים לפי לבצע מיליון שלבים.

עכשיו יש לך שני פרופילים נפרדים, אחד לאפליקציות לשימוש אישי ואחד לאפליקציות לעבודה. אפשר לעבור ביניהם באמצעות הכרטיסיות שבחלק העליון של רשימת האפליקציות.

אישי/עבודה
פרופיל

כשמתקינים את האפליקציה, בדרך כלל היא מותקנת באופן אוטומטי בשני המכשירים פרופילים. אם בעתיד יהיה צורך להתקין את האפליקציה באופן מפורש בפרופיל העבודה, יכול להשתמש בארגומנט --user עם התקנת adb.

$ adb install --user [id number of profile] [path of apk file]

פרטים נוספים על הגדרה של מכשיר בדיקה זמינים כאן .

מוודאים שהאפליקציה מוגדרת כראוי

הפעלת Java 8 תמיכה ולוודא שה-minSDK הוא 19 לפחות.

הוספת יחסי תלות של ggle

dependencies {
  annotationProcessor
'com.google.android.enterprise.connectedapps:connectedapps-processor:1.1.2'
  implementation
'com.google.android.enterprise.connectedapps:connectedapps:1.1.2'
  implementation
'com.google.android.enterprise.connectedapps:connectedapps-annotations:1.1.2'
}

בדוגמה הזו אנחנו משתמשים בגויאבה. זו לא דרישה לשימוש ב-SDK, אלא ולעקוב אחרי עולם השלום, צריך גם להוסיף api("com.google.guava:guava:29.0-android")

יצירת כיתה חדשה שתכיל את הקריאה לבדיקה במספר פרופילים

כדי שיהיה לכם יותר שימושי בהמשך, כדאי להכניס את הקוד לאותה חבילה רוצה שהשיחות האמיתיות בין פרופילים יגיעו.

public class HelloWorld {

  @CrossProfile
  public ListenableFuture<String> helloWorld() {
    return Futures.immediateFuture("Hello world");
  }
}

אם אתם לא יכולים להסתמך על תמיכה ב-Guava for Futures, פשוט תעקבו אחרי זה בינתיים ואז לראות את השלב הסופי שינחה אתכם אילו שינויים לבצע.

ביצוע שיחה בין פרופילים

אפשר לעשות את זה בכיתה שיהיה בה צורך לבצע שיחות אמיתיות בין פרופילים מאוחר יותר.

// TODO: inject/pass these into the class later instead.
CrossProfileConnector crossProfileConnector =
  CrossProfileConnector.builder(this).build();
ProfileHelloWorld profileHelloWorld =
  ProfileHelloWorld.create(crossProfileConnector);

ListenableFuture<Map<Profile, String>> resultsFuture =
  profileHelloWorld.both().helloWorld();

FluentFuture.from(resultsFuture)
  .addCallback(new FutureCallback<Map<Profile, String>>() {
    @Override
    public void onSuccess(Map<Profile, String> results) {
      for (Profile profile : results.keySet()) {
        Log.w("tag", "CROSS_PROFILE profile: " + profile.asInt()
          +   "; result: " + results.get(profile));
      }
    }
    @Override
    public void onFailure(Throwable t) {
      Log.e(TAG, "Failed to say hello world on both profiles", t);
    }
  }, directExecutor());

צריך לספק את המופע ל-SDK

כמובן, הפעלת ה-method helloWorld שהוזכרה קודם לכן הכיתה ולא האמיתית. לעיתים קרובות, הכיתות האמיתיות שלכם הן יחידים או מחלקות מורכבות שתלויות במסגרות החדרת תלות כמו Dagger. שפת תרגום אפשר לקרוא ללוגיקה בכיתה האמיתית בפרופיל השני, כל למחלקה אחת (@CrossProfile) חייבת להיות שיטת ספק תואמת כיתה אחת (@CrossProfileProvider). יצירת הכיתה הזו.

public class HelloWorldProvider {

  @CrossProfileProvider
  public HelloWorld getHelloWorld() {
    return new HelloWorld();
  }
}

חיווט נוסף

כדי לתמוך במחלקות ובשיטות מותאמות אישית, צריך ליצור קוד מוסיפים מעט חיווט. המטרה היא להתמודד עם המורכבות של יעדי build רבים ודרישות חשיפה רבות בקנה מידה רחב.

ראשית, מוסיפים הערות לכיתה קיימת או חדשה ברמה גבוהה עם @CrossProfileConfiguration, מפנה למחלקות של הספקים.

@CrossProfileConfiguration(providers = HelloWorldProvider.class)
abstract class HelloWorldConfiguration {}

לאחר מכן, מוסיפים את השירות שנוצר באופן אוטומטי למניפסט, בתוך <application> tag ייתכן שהבעיה לא תיפתר עד ליצירת הפרויקט.

<service
android:name="com.google.android.enterprise.connectedapps.CrossProfileConnector_Service"
android:exported="false"/>

לסיום, למטרות פיתוח, עליך לספק לעצמך INTERACT_ACROSS_USERS הרשאה. אם עדיין לא הגדרת, לא תהיה לך אפשרות לשמור אותו ב- אבל זו הדרך הקלה ביותר להתחיל. קודם כל, הוסיפו אותו באופן הבא:

<uses-permission
      android:name="android.permission.INTERACT_ACROSS_USERS"
      tools:ignore="ProtectedPermissions"/>

לאחר מכן תוכלו להעניק לעצמכם את ההרשאה משורת הפקודה עם adb כ- עוקב (אם עדיין לא התקנת אותו באפליקציה):

adb shell pm grant <your package> android.permission.INTERACT_ACROSS_USERS

אם לא הצלחת להסתמך על Guava for Futures, עליך לבצע כמה פעולות שינויים. קודם כל, נחזיר את מחרוזת ישירות והדפסת התוצאות של קריאה חוצת-פרופילים. שנית, מכיוון שהשיחות האלה עכשיו מסונכרנות, עליך לבצע את הקריאה חוצת-הפרופילים והדפסת התוצאות בתוך האזנה לחיבור.

כאשר מריצים את הקוד שמופיע בקטע 'ביצוע קליק במספר פרופילים' אתם אמורים לראות שני יומנים עבור 'Hello World', אחד מכל פרופיל. אם מקבלים רק יומן אחד, לוודא שהתקנתם את האפליקציה בשני הפרופילים ושקיבלתם את הרשאה.