العيّنة الأساسية

يوضح لك هذا القسم كيفية إنشاء مكالمة أهلاً عالميًا بين الملف الشخصي وملف العمل ضمن تطبيقك. وسيتيح لك ذلك الإلمام بحزمة SDK وملف والتنفيذ للبناء عليها. ننصحك بالمتابعة بنشاط عن طريق التطوير في تطبيقك.

إعداد جهاز اختباري باستخدام ملف شخصي للعمل

تُصمّم Google تطبيق Test DPC لمساعدتك في محاكاة واختبار تطبيقات البيئة على جهازك الخاص. سيقوم بإعداد ملف شخصي للعمل ويزودك مع عناصر تحكُّم لتفعيل ميزات معيّنة أو إيقافها على الجهاز.

  • تثبيت تطبيق Test DPC

    افتح "متجر Google Play" ونزِّل تطبيق Test DPC.

  • إعداد الملف الشخصي للعمل

    عندما يتم تثبيت التطبيق، من المفترض أن يظهر لك رمزان على الجهاز رمز الإعداد ورمز تطبيق Test DPC. انقر على رمز الإعداد واتّبِع الخطوات.

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

شخصي/عمل
الملف الشخصي

عند تثبيت تطبيقك، سيتم تثبيته تلقائيًا في كلتا الحالتين الشخصية. وإذا احتجت في أي وقت إلى تثبيته بشكل صريح في ملف العمل، يمكنك يمكن استخدام الوسيطة --user مع adb install.

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

لمزيد من التفاصيل حول إعداد جهاز اختباري، يُرجى الانتقال إلى هذا .

التأكّد من ضبط التطبيق بشكل مناسب

تفعيل java 8 الدعم وتأكد من أن minSdk 19 على الأقل.

إضافة تبعيات Gradle

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، ولكن تتابعوا معًا كلمة hello world، فلابد من إضافة api("com.google.guava:guava:29.0-android")

أنشِئ صفًا جديدًا يتضمّن المكالمة التجريبية بين الملف الشخصي وملف العمل.

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

public class HelloWorld {

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

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

إجراء مكالمة بين الملف الشخصي وملف العمل

يمكنك إجراء ذلك في صف ستحتاج إلى إجراء مكالمات حقيقية بين الملف الشخصي وملف العمل. لاحقًا.

// 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)

وبالطبع، فإنّ استدعاء طريقة helloWorld المذكورة سابقًا هو تابع لعملية يتم إنشاؤها صف واحد وليس الحقيقي. في كثير من الأحيان، تكون صفوفك الحقيقية هي سينغلتون أو غيرها فئات معقدة تعتمد على أطر حقن التبعية مثل Dagger. للسماح بالاتّصال بالمنطق في الفئة الحقيقية في الملف التجاري الآخر، يجب أن تحتوي كل فئة مخصّصة من فئة @CrossProfile على طريقة مقدّم خدمة مقابلة في فئة @CrossProfileProvider. إنشاء هذا الصف

public class HelloWorldProvider {

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

أسلاك إضافية

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

أولاً، قم بإضافة تعليق توضيحي لفصل عالي المستوى موجود أو جديد باستخدام @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

إذا لم تكن قادرًا على الاعتماد على Java للعقود الآجلة، فستحتاج إلى عمل بعض التغييرات. أولاً، قم بإرجاع "Hello World" السلسلة مباشرة وطباعة النتائج بين الملف الشخصي وملف العمل. ثانيًا، بما أن هذه المكالمات متزامنة الآن، فيجب عليك إجراء الاتصال بين الملف الشخصي وطباعة النتائج داخل مستمع اتصال.

عند تشغيل التعليمة البرمجية المدرجة ضمن "إجراء عملية حسابية بين الملفات الشخصية" من المفترض أن ترى سجلان لـ ''Hello World''، واحد من كل ملف شخصي. إذا كان لديك سجل واحد فقط، والتأكد من تثبيت تطبيقك في كلا الملفين الشخصيين ومن منح إذن.