الساعة : ترحيل تطبيقات الساعة إلى واجهة google

الإعلانات

ترحيل تطبيقات الساعة إلى واجهة برمجة تطبيقات google

 

 

بدءاً من الإصدار 11.8.0 لخدمات قوقل بلي، يجب أن يتم ترحيل تطبيقات الساعة بعيداً عن فئة GoogleApiClient ..

ويستخدم بدلاً من ذلك كائنات العميل التي تعتمد على فئة “واجهة برمجة تطبيقات قوقل” GoogleApi.

إستخدام واجهة برمجة تطبيقات قوقل  google يسهل عملية إعداد العمليات الغير متزامنة. مثال، كما هو موضح في مقدمة واجهة برمجة تطبيقات المهام..

يمكنك الحصول على كائن مهمة بدلاً من كائن PendingResult.

هذه الصفحة تشمل على:

– جدول بالمكونات البديله

– مثال على تحديث تطبيق حالي لكي يستخدم واجهة برمجة تطبيقات المهام

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

 

 

 

 

 

بدائل للمكونات التي تم إيقافها


عندما تستخدم الفئات التي توسع فئة “واجهة برمجة تطبيقات google قوقل GoogleApi ، مثل DataClient و MessageClient ..

تقوم خدمات SDK لقوقل بلي بإدارة الإتصالات بخدمات قوقل بلي نيابةً عنك.

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

راجع، الوصول إلى واجهات برمجة تطبيقات قوقل والصفحة المرجعية لفئة الساعة.

 

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

المكون الموقوف مكون الإستبدال
CapabilityApi CapabilityClient
Channel ChannelClient.Channel
ChannelApi ChannelClient
DataApi DataClient
MessageApi MessageClient
NodeApi  NodeClient

 

 

أيضاً لاحظ ما يلي:

– للحصول على إشعارات بالتغييرات على القنوات، يتم إستبدال Channel.ChannelListener بواسطة ChannelClient.ChannelCallback

– لتعيين تسلسل لإستدعاءات المستمع، يتم إستبدال ” عميل واجهة قوقل google ” GoogleApiClient.Builder.setHandler بواسطة دالة setLooper من WearableOptions.Builder

 

 

 

 

مثال على الترحيل لتطبيق الساعة


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

للإصدار 11.8.0 من خدمات قوقل بلي google play. إذا كان تطبيقك يحتوي على وحدة هاتفية، فقد تكون تحديثاته مشابهة لتحديثات وحدة الساعه.

 

 

 

 

 

 

تحديث الإعتمادات على خدمات قوقل بلي google play

لأن تطبيقك قد يعتمد على إصدار سابق من خدمات قوقل بلي google play ، يمكنك تحديث الإعتماد التالي في ملف البناء build.gradle لوحدة ساعتك:

dependencies {
...
compile 'com.google.android.gms:play-services-wearable:11.8.0'
}

 

 

 

 

 

تحديث تصاريح الإستيراد الخاصة بتطبيقك

إستيراد الفئات الضرورية، بما في ذلك الفئات الموجودة في واجهة برمجة تطبيقات المهام.

مثال، يتضمن نموذج طبقة بيانات الساعة سابقاً تصريح الإستيراد التالي في ملف الجافا MainActivity.java. يجب إزالة تصريح الإستيراد هذا:

KOTLIN

...
import com.google.android.gms.common.api.GoogleApiClient
...

JAVA

...
import com.google.android.gms.common.api.GoogleApiClient;
...

 

 

في نموذج طبقة بيانات الساعة، تم إستبدال تصاريح الإستيراد import مثل الوارد أعلاه، على سبيل المثال بما يلي (الثاني هو للتعامل مع إستثناءات المهام):

KOTLIN

...
import com.google.android.gms.tasks.Tasks
import java.util.concurrent.ExecutionException
...

JAVA

...
import com.google.android.gms.tasks.Tasks;
import java.util.concurrent.ExecutionException;
...

 

 

 

 

تنفيذ واجهات العميل الجديدة

قم بإزالة أي إستخدام لفئة “عميل واجهة برمجة تطبيقات google قوقل” GoogleApiClient والواجهات المرتبطة كـ(ConnectCallbacks ..

 OnConnectionFailedListener ، إلخ.) وقم بإستبدال تنفيذات المستمعين الأخرى بإصداراتها الجديدة.

الدوال الفعلية للتجاوز عموماً لها نفس الأسماء كما في السابق، لذلك فإن التغيير الرئيسي سيكون مشابه للمثال التالي.

النشاط الرئيسي لنموذج طبقة بيانات الساعه (كما هو مشار إلى الفرق على موقع GitHub)

قد تم تنفيذه، على سبيل المثال، الواجهة CapabilityApi.CapabilityListener. ولكن الآن، يقوم النشاط الرئيسي بتنفيذ CapabilityClient.OnCapabilityChangedListener.

 

فيما يلي مقارنة بين تعريفات الفئه.

في ما يلي مقتطف لما قبل إستخدام الإصدار 11.8.0 من خدمات قوقل بلي google play:

KOTLIN

class MainActivity :
        Activity(),
        GoogleApiClient.ConnectionCallbacks,
        GoogleApiClient.OnConnectionFailedListener,
        DataApi.DataListener,
        MessageApi.MessageListener,
        CapabilityApi.CapabilityListener

JAVA

public class MainActivity extends Activity implements
  ConnectionCallbacks,
  OnConnectionFailedListener,
  DataApi.DataListener,
  MessageApi.MessageListener,
  CapabilityApi.CapabilityListener

في ما يلي مقتطف لما بعد إستخدام الإصدار 11.8.0 من خدمات قوقل بلي google play:

KOTLIN

class MainActivity :
        Activity(),
        DataClient.OnDataChangedListener,
        MessageClient.OnMessageReceivedListener,
        CapabilityClient.OnCapabilityChangedListener

JAVA

public class MainActivity extends Activity implements
  DataClient.OnDataChangedListener,
  MessageClient.OnMessageReceivedListener,
  CapabilityClient.OnCapabilityChangedListener

 

 

 

 

 

 

إزالة وإضافة المستمعين

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

يوجد أدناه مقتطف من نموذج طبقة بيانات الساعة التي تم تعديلها: 

KOTLIN

override fun onResume() {
    super.onResume()
    Wearable.getDataClient(this).addListener(this)
    Wearable.getMessageClient(this).addListener(this)
    Wearable.getCapabilityClient(this)
            .addListener(
                    this,
                    Uri.parse("wear://"),
                    CapabilityClient.FILTER_REACHABLE
            )
}

override fun onPause() {
    super.onPause()
    Wearable.getDataClient(this).removeListener(this)
    Wearable.getMessageClient(this).removeListener(this)
    Wearable.getCapabilityClient(this).removeListener(this)
}

JAVA

@Override
protected void onResume() {
  super.onResume();
  Wearable.getDataClient(this).addListener(this);
  Wearable.getMessageClient(this).addListener(this);
  Wearable.getCapabilityClient(this)
  .addListener(
    this, Uri.parse("wear://"), CapabilityClient.FILTER_REACHABLE);
}

@Override
protected void onPause() {
  super.onPause();
  Wearable.getDataClient(this).removeListener(this);
  Wearable.getMessageClient(this).removeListener(this);
  Wearable.getCapabilityClient(this).removeListener(this);
}

 

 

 

 

 

 

طلب معلومات بإستخدام واجهة برمجة تطبيقات المهام

قد ترغب في طلب معلومات من خارج المستمعين، لتحديث تطبيقك عندما يكون هناك تغيير في البيانات.

في مثل هذه الحالات، قم بإجراء طلب بإستخدام عميل مثل “عميل البيانات” DataClient، بالإقتران مع واجهة برمجة تطبيقات المهام، وفئة النتيجة (أي، كـ <Task<ResultType).

 

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

KOTLIN

private fun showNodes(vararg capabilityNames: String) {
    Wearable.getCapabilityClient(this)
            .getAllCapabilities(CapabilityClient.FILTER_REACHABLE).apply {
                addOnSuccessListener { capabilityInfoMap ->
                    val nodes: Set<Node> = capabilityInfoMap
                            .filter { capabilityNames.contains(it.key) }
                            .flatMap { it.value.nodes }
                            .toSet()
                    showDiscoveredNodes(nodes)
                }
            }
}

private fun showDiscoveredNodes(nodes: Set<Node>) {
    val nodesList: Set<String> = nodes.map { it.displayName }.toSet()
    val msg: String = if (nodesList.isEmpty()) {
        Log.d(TAG, "Connected Nodes: No connected device was found for the given capabilities")
        getString(R.string.no_device)
    } else {
        Log.d(TAG, "Connected Nodes: ${nodesList.joinToString(separator = ", ")}")
        getString(R.string.connected_nodes, nodesList)
    }
    Toast.makeText(this@MainActivity, msg, Toast.LENGTH_LONG).show()
}

JAVA

private void showNodes(final String... capabilityNames) {
  Task<Map<String, CapabilityInfo>> capabilitiesTask =
    Wearable.getCapabilityClient(this)
            .getAllCapabilities(CapabilityClient.FILTER_REACHABLE);
  capabilitiesTask.addOnSuccessListener(new
    OnSuccessListener<Map<String, CapabilityInfo>>() {
      @Override
      public void onSuccess(Map<String, CapabilityInfo>
        capabilityInfoMap) {
          Set<Node> nodes = new HashSet<>();
          if (capabilityInfoMap.isEmpty()) {
            showDiscoveredNodes(nodes);
            return;
          }
          for (String capabilityName : capabilityNames) {
            CapabilityInfo capabilityInfo = capabilityInfoMap.get(capabilityName);
            if (capabilityInfo != null) {
              nodes.addAll(capabilityInfo.getNodes());
            }
          }
          showDiscoveredNodes(nodes);
      }
  });
}

private void showDiscoveredNodes(Set<Node> nodes) {
  List<String> nodesList = new ArrayList<>();
  for (Node node : nodes) {
    nodesList.add(node.getDisplayName());
  }
  LOGD(TAG, "Connected Nodes: " + (nodesList.isEmpty()
    ? "No connected device was found for the given capabilities"
    : TextUtils.join(",", nodesList)));
  String msg;
  if (!nodesList.isEmpty()) {
    msg = getString(R.string.connected_nodes, TextUtils.join(", ", nodesList));
  } else {
    msg = getString(R.string.no_device);
  }
  Toast.makeText(MainActivity.this, msg, Toast.LENGTH_LONG).show();
}

 

 

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

وكمثال على إستخدام المهام الثقيلة، من خارج تسلسل واجهة المستخدم أو في إحدى الخدمات، هناك خيار آخر متاح.

في ما يلي مثال على كيفية حظر إحدى المهام والحصول على النتيجة بشكلٍ متزامن:

KOTLIN

override fun doInBackground(vararg params: Asset): Bitmap? {
    if (params.isNotEmpty()) {
        val asset = params[0]
        val getFdForAssetResponseTask: Task<DataClient.GetFdForAssetResponse> =
                Wearable.getDataClient(applicationContext).getFdForAsset(asset)
        return try {
            // Block on a task and get the result synchronously. This is generally done
            // when executing a task inside a separately managed background thread. Doing
            // this on the main (UI) thread can cause your application to become
            // unresponsive.
            val getFdForAssetResponse: DataClient.GetFdForAssetResponse =
                    Tasks.await(getFdForAssetResponseTask)
            getFdForAssetResponse.inputStream?.let { assetInputStream ->
                BitmapFactory.decodeStream(assetInputStream)
            } ?: run {
                Log.w(TAG, "Requested an unknown Asset.")
                null
            }

        } catch (exception: ExecutionException) {
            Log.e(TAG, "Failed retrieving asset, Task failed: $exception")
            return null
        } catch (exception: InterruptedException) {
            Log.e(TAG, "Failed retrieving asset, interrupt occurred: $exception")
            return null
        }

    } else {
        Log.e(TAG, "Asset must be non-null")
        return null
    }
}

override fun onPostExecute(bitmap: Bitmap?) {
    bitmap?.also {
        Log.d(TAG, "Setting background image on second page..")
        moveToPage(1)
        assetFragment.setBackgroundImage(it)
    }
}

JAVA 

@Override
protected Bitmap doInBackground(Asset... params) {
  if (params.length > 0) {
    Asset asset = params[0];
    Task<DataClient.GetFdForAssetResponse> getFdForAssetResponseTask =
      Wearable.getDataClient(getApplicationContext()).getFdForAsset(asset);
    try {
      // Block on a task and get the result synchronously. This is generally done
      // when executing a task inside a separately managed background thread. Doing
      // this on the main (UI) thread can cause your application to become
      // unresponsive.
      DataClient.GetFdForAssetResponse getFdForAssetResponse =
        Tasks.await(getFdForAssetResponseTask);
      InputStream assetInputStream = getFdForAssetResponse.getInputStream();
      if (assetInputStream != null) {
        return BitmapFactory.decodeStream(assetInputStream);
      } else {
        Log.w(TAG, "Requested an unknown Asset.");
        return null;
      }

    } catch (ExecutionException exception) {
      Log.e(TAG, "Failed retrieving asset, Task failed: " + exception);
      return null;
    } catch (InterruptedException exception) {
      Log.e(TAG, "Failed retrieving asset, interrupt occurred: " + exception);
      return null;
    }
  } else {
    Log.e(TAG, "Asset must be non-null");
    return null;
  }
}

@Override
protected void onPostExecute(Bitmap bitmap) {
  if (bitmap != null) {
    LOGD(TAG, "Setting background image on second page..");
    moveToPage(1);
    assetFragment.setBackgroundImage(bitmap);
  }
}

 

راجع أيضاً:

درس إنشاء تطبيق للساعة

 


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

الإعلانات

1 thought on “الساعة : ترحيل تطبيقات الساعة إلى واجهة google”

اترك رد