يوضّح هذا الدليل التغييرات بين الأماكن ومكتبة التوافق والإصدار المستقل الجديد من حزمة تطوير برامج الأماكن لنظام التشغيل Android إذا كنت تستخدم مكتبة توافق الأماكن بدلاً من الانتقال إلى الإصدار الجديد المستقل من حزمة تطوير برامج الأماكن لأجهزة Android، يعرض لك هذا الدليل كيفية تحديث مشاريعك لاستخدام الإصدار الجديد من حزمة Places SDK لنظام التشغيل Android
الطريقة الوحيدة للوصول إلى الميزات وإصلاحات الأخطاء في حزمة تطوير برامج الأماكن لنظام التشغيل Android في الإصدار 2.6.0 أعلاه سيكون يستخدم حزمة تطوير برامج الأماكن لأجهزة Android. تنصح Google بالتحديث من مكتبة التوافق إلى الإصدار الجديد حزمة تطوير برامج الأماكن لإصدار Android في أقرب وقت ممكن.
ما التغييرات التي أُجريت؟
في ما يلي الجوانب الرئيسية للتغيير:
- يتم توزيع الإصدار الجديد من حزمة تطوير برامج الأماكن لأجهزة Android كمكتبة عميل ثابتة. قبل كانون الثاني (يناير) 2019، كانت حزمة تطوير برامج الأماكن لأجهزة Android تم توفيره من خلال خدمات Google Play. ومنذ ذلك الحين، ظهرت إحدى الأماكن لتيسير الانتقال إلى الإصدار الجديد حزمة تطوير برامج الأماكن لأجهزة Android
- تتوفّر طُرق جديدة تمامًا.
- أصبحت أقنعة الحقل متاحة الآن للطرق التي تُرجع أماكن. التفاصيل. يمكنك استخدام أقنعة الحقل لتحديد أنواع بيانات المكان التي إرجاع.
- تم تحسين رموز الحالة المستخدمة للإبلاغ عن الأخطاء.
- تتيح ميزة الإكمال التلقائي الآن استخدام الرموز المميّزة للجلسة.
- لم يعد منتقي الأماكن متوفرًا.
حول مكتبة توافق الأماكن
وفي يناير 2019 ومع إطلاق الإصدار 1.0 من حزمة تطوير برامج الأماكن المستقلة لنظام التشغيل Android،
قدّمت Google مكتبة توافق للمساعدة في عملية نقل البيانات.
من إصدار "خدمات Google Play" الذي تم إيقافه من أجل الحصول على حزمة تطوير برامج الأماكن لنظام التشغيل Android
(com.google.android.gms:play-services-places
).
تم توفير مكتبة التوافق هذه مؤقتًا لإعادة التوجيه والترجمة. طلبات البيانات من واجهة برمجة التطبيقات التي تستهد�� إصدار "خدمات Google Play" إلى الإصدار المستقل الجديد إلى أن يتمكن مطورو البرامج من ترحيل رموزهم لاستخدام الأسماء الجديدة في حزمة SDK مستقلة. لكل إصدار من إصدارات حزمة الأماكن لأجهزة Android تم إصداره من الإصدار 1.0 إلى الإصدار 2.6.0، ��هو إصدار مطابق من مكتبة توافق الأماكن التي تم إصدارها لتوفير مكافئ الوظيفة.
تجميد وإيقاف مكتبة التوافق في الأماكن
جميع إصدارات مكتبة التوافق لحزمة تطوير برامج "الأماكن" لأجهزة Android متوقفة نهائيًا اعتبارًا من 31 آذار (مارس) 2022. فالإصدار 2.6.0 هو آخر إصدار مكتبة توافق الأماكن. الطريقة الوحيدة للوصول إلى الميزات وإصلاحات الأخطاء في الأماكن وسوف تستخدم حزمة SDK لنظام التشغيل Android الأحدث الإصدار 2.6.0 حزمة SDK للأماكن لنظام التشغيل Android.
تنصح Google بالنقل إلى حزمة تطوير برامج الأماكن لأجهزة Android للاستفادة من الميزات الجديدة وإصلاحات الأخطاء المهمة في الإصدارات الأحدث من الإصدار 2.6.0. إذا كنت تستخدم مكتبة التوافق حاليًا، يُرجى اتّباع الخطوات أدناه في تثبيت قسم SDK للأماكن لأجهزة Android لنقل البيانات إلى حزمة تطوير برامج الأماكن لأجهزة Android.
تثبيت مكتبة البرامج
يتم توزيع الإصدار الجديد من حزمة تطوير برامج الأماكن لأجهزة Android باعتباره ومكتبة عميل ثابتة.
استخدِم Maven لإضافة حزمة تطوير برامج الأماكن لأجهزة Android لمشروعك على "استوديو Android":
إذا كنت تستخدم حاليًا مكتبة توافق الأماكن:
استبدِل السطر التالي في القسم
dependencies
:implementation 'com.google.android.libraries.places:places-compat:X.Y.Z'
باستخدام هذا السطر للتبديل إلى حزمة تطوير برامج الأماكن لأجهزة Android:
implementation 'com.google.android.libraries.places:places:3.3.0'
إذا كنت تستخدم حاليًا إصدار "خدمات Play" من حزمة تطوير برامج الأماكن لنظام التشغيل Android:
استبدِل السطر التالي في القسم
dependencies
:implementation 'com.google.android.gms:play-services-places:X.Y.Z'
باستخدام هذا السطر للتبديل إلى حزمة تطوير برامج الأماكن لأجهزة Android:
implementation 'com.google.android.libraries.places:places:3.3.0'
مزامنة مشروع Gradle
اضبط السمة
minSdkVersion
لمشروع تطبيقك على 16 أو أعلى.تحديث بطاقة "بواسطة Google" الأصول:
@drawable/powered_by_google_light // OLD @drawable/places_powered_by_google_light // NEW @drawable/powered_by_google_dark // OLD @drawable/places_powered_by_google_dark // NEW
أنشئ تطبيقك. إذا ظهرت لك أي أخطاء في الإصدار بسبب التحويل إلى حزمة تطوير برامج الأماكن لأجهزة Android، راجع الأقسام أدناه للحصول على معلومات على كيفية حل هذه الأخطاء
إعداد برنامج حزمة تطوير البرامج (SDK) الجديد للأماكن
يجب إعداد برنامج حزمة تطوير البرامج (SDK) الجديد لـ "الأماكن" كما هو موضّح في المثال التالي:
// Add an import statement for the client library.
import com.google.android.libraries.places.api.Places;
...
// Initialize Places.
Places.initialize(getApplicationContext(), apiKey);
// Create a new Places client instance.
PlacesClient placesClient = Places.createClient(this);
رموز الحالة
تم تغيير رمز حالة أخطاء الحد الأقصى لعدد الطلبات في الثانية (QPS). توجد الآن أخطاء متعلقة بحدود عدد الطلبات في الثانية
تم إرجاعه عبر PlaceStatusCodes.OVER_QUERY_LIMIT
. ما مِن حدود "QPD".
تمت إضافة رموز الحالة التالية:
REQUEST_DENIED
: تم رفض الطلب. وتشمل الأسباب المحتملة ما يلي:- لم يتم تقديم أي مفتاح لواجهة برمجة التطبيقات.
- تم إدخال مفتاح غير صالح لواجهة برمجة التطبيقات.
- لم يتم تفعيل Places API في Cloud Console.
- تم تقديم مفتاح واجهة برمجة تطبيقات مع قيود مفتاح غير صحيحة.
INVALID_REQUEST
— الطلب غير صالح نظرًا لأنه مفقود أو غير صالح الوسيطة.NOT_FOUND
— لم يتم العثور على أي نتائج للطلب المحدّد.
الطرق الجديدة
يقدم الإصدار الجديد من حزمة تطوير برامج الأماكن لأجهزة Android ميزات جديدة والطرق المصمَّمة لتحقيق الاتساق. جميع الطرق الجديدة الالتزام بما يلي:
- لم تعد نقاط النهاية تستخدم الفعل
get
. - تشترك عناصر الطلبات والاستجابة في الاسم نفسه مثل طريقة العميل.
- اطلب الكائنات الآن بها أدوات إنشاء؛ يتم تمرير المَعلمات المطلوبة عند الطلب معلمات إنشاء المشروع.
- لم تعُد الموارد الاحتياطية مستخدمة.
يقدم هذا القسم الطرق الجديدة ويوضح لك كيفية عملها.
استرجاع مكان باستخدام رقم التعريف
استخدام fetchPlace()
للحصول على تفاصيل حول مكان معين. تعمل fetchPlace()
بشكل مشابه لـ
getPlaceById()
اتبع الخطوات التالية لجلب مكان:
طلب
fetchPlace()
، مع تمرير كائنFetchPlaceRequest
يحدد مكانًا رقم تعريف وقائمة حقول تحدِّد بيانات المكان المطلوب عرضها// Define a Place ID. String placeId = "INSERT_PLACE_ID_HERE"; // Specify the fields to return. List<Place.Field> placeFields = Arrays.asList(Place.Field.ID, Place.Field.NAME); // Construct a request object, passing the place ID and fields array. FetchPlaceRequest request = FetchPlaceRequest.builder(placeId, placeFields) .build();
يمكنك الاتصال بـ
addOnSuccessListener()
للتعامل معFetchPlaceResponse
. أغنية واحدة تم عرض نتيجة واحدة (Place
).// Add a listener to handle the response. placesClient.fetchPlace(request).addOnSuccessListener((response) -> { Place place = response.getPlace(); Log.i(TAG, "Place found: " + place.getName()); }).addOnFailureListener((exception) -> { if (exception instanceof ApiException) { ApiException apiException = (ApiException) exception; int statusCode = apiException.getStatusCode(); // Handle error with given status code. Log.e(TAG, "Place not found: " + exception.getMessage()); } });
استرجاع صورة مكان
استخدام fetchPhoto()
للحصول على صورة للمكان. يعرض fetchPhoto()
صورًا لمكان معيّن. النمط
تم تبسيط طلب صورة. يمكنك الآن طلب مبلغ PhotoMetadata
مباشرةً من الكائن Place
طلب منفصل لم يعد ضروريًا.
يمكن أن يبلغ عرض الصور أو ارتفاعها 1600 بكسل كحد أقصى. دوال fetchPhoto()
تمامًا مثل getPhoto()
.
اتبع الخطوات التالية لجلب صور الأماكن:
يمكنك إعداد مكالمة مع
fetchPlace()
. تأكد من تضمين الحقلPHOTO_METADATAS
في طلبك:List<Place.Field> fields = Arrays.asList(Place.Field.PHOTO_METADATAS);
الحصول على كائن مكان (يستخدم هذا المثال
fetchPlace()
، ولكن يمكنك أيضًا استخدامfindCurrentPlace()
):FetchPlaceRequest placeRequest = FetchPlaceRequest.builder(placeId, fields).build();
يمكنك إضافة
OnSuccessListener
للحصول على البيانات الوصفية للصور منPlace
فيFetchPlaceResponse
، ثم استخدِم البيانات الوصفية الناتجة عن الصور من أجل الحصول على صورة نقطية ونص إحالة:placesClient.fetchPlace(placeRequest).addOnSuccessListener((response) -> { Place place = response.getPlace(); // Get the photo metadata. PhotoMetadata photoMetadata = place.getPhotoMetadatas().get(0); // Get the attribution text. String attributions = photoMetadata.getAttributions(); // Create a FetchPhotoRequest. FetchPhotoRequest photoRequest = FetchPhotoRequest.builder(photoMetadata) .setMaxWidth(500) // Optional. .setMaxHeight(300) // Optional. .build(); placesClient.fetchPhoto(photoRequest).addOnSuccessListener((fetchPhotoResponse) -> { Bitmap bitmap = fetchPhotoResponse.getBitmap(); imageView.setImageBitmap(bitmap); }).addOnFailureListener((exception) -> { if (exception instanceof ApiException) { ApiException apiException = (ApiException) exception; int statusCode = apiException.getStatusCode(); // Handle error with given status code. Log.e(TAG, "Place not found: " + exception.getMessage()); } }); });
العثور على مكان من الموقع الجغرافي للمستخدم
استخدام findCurrentPlace()
للاطّلاع على الموقع الجغرافي الحالي لجهاز المستخدم. findCurrentPlace()
عرض قائمة من PlaceLikelihood
تشير إلى الأماكن التي استخدم فيها جهاز المستخدم
موقعها على الأرجح. تعمل findCurrentPlace()
بشكل مشابه لـ
getCurrentPlace()
اتّبِع الخطوات التالية لمعرفة الموقع الجغرافي الحالي لجهاز المستخدم:
تأكَّد من أنّ تطبيقك يطلب
ACCESS_FINE_LOCATION
أذو��اتACCESS_WIFI_STATE
. يجب أن يمنح المستخدم إذنًا للوصول إلى الموقع الجغرافي الحالي للجهاز الاطّلاع على طلب التطبيق الأذونات لـ التفاصيل.إنشاء
FindCurrentPlaceRequest
، بما في ذلك قائمة بأنواع بيانات الأماكن إرجاع.// Use fields to define the data types to return. List<Place.Field> placeFields = Arrays.asList(Place.Field.NAME); // Use the builder to create a FindCurrentPlaceRequest. FindCurrentPlaceRequest request = FindCurrentPlaceRequest.builder(placeFields).build();
يمكنك الاتصال بـ findCurrentPlace والتعامل مع الرد، والتحقق أولاً من ذلك منح المستخدم إذنًا لاستخدام الموقع الجغرافي للجهاز.
// Call findCurrentPlace and handle the response (first check that the user has granted permission). if (ContextCompat.checkSelfPermission(this, ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { placesClient.findCurrentPlace(request).addOnSuccessListener(((response) -> { for (PlaceLikelihood placeLikelihood : response.getPlaceLikelihoods()) { Log.i(TAG, String.format("Place '%s' has likelihood: %f", placeLikelihood.getPlace().getName(), placeLikelihood.getLikelihood())); textView.append(String.format("Place '%s' has likelihood: %f\n", placeLikelihood.getPlace().getName(), placeLikelihood.getLikelihood())); } })).addOnFailureListener((exception) -> { if (exception instanceof ApiException) { ApiException apiException = (ApiException) exception; Log.e(TAG, "Place not found: " + apiException.getStatusCode()); } }); } else { // A local method to request required permissions; // See https://developer.android.com/training/permissions/requesting getLocationPermission(); }
العثور على عبارات بحث مقترحة للإكمال التلقائي
استخدام findAutocompletePredictions()
لعرض توقعات الأماكن استجابةً لطلبات بحث المستخدم.
تعمل findAutocompletePredictions()
بشكل مشابه لـ
getAutocompletePredictions()
يوضح المثال التالي حالة الاتصال بالرقم findAutocompletePredictions()
:
// Create a new token for the autocomplete session. Pass this to FindAutocompletePredictionsRequest,
// and once again when the user makes a selection (for example when calling fetchPlace()).
AutocompleteSessionToken token = AutocompleteSessionToken.newInstance();
// Create a RectangularBounds object.
RectangularBounds bounds = RectangularBounds.newInstance(
new LatLng(-33.880490, 151.184363),
new LatLng(-33.858754, 151.229596));
// Use the builder to create a FindAutocompletePredictionsRequest.
FindAutocompletePredictionsRequest request = FindAutocompletePredictionsRequest.builder()
// Call either setLocationBias() OR setLocationRestriction().
.setLocationBias(bounds)
//.setLocationRestriction(bounds)
.setCountry("au")
.setTypesFilter(Arrays.asList(PlaceTypes.ADDRESS))
.setSessionToken(token)
.setQuery(query)
.build();
placesClient.findAutocompletePredictions(request).addOnSuccessListener((response) -> {
for (AutocompletePrediction prediction : response.getAutocompletePredictions()) {
Log.i(TAG, prediction.getPlaceId());
Log.i(TAG, prediction.getPrimaryText(null).toString());
}
}).addOnFailureListener((exception) -> {
if (exception instanceof ApiException) {
ApiException apiException = (ApiException) exception;
Log.e(TAG, "Place not found: " + apiException.getStatusCode());
}
});
الرموز المميزة للجلسة
تعمل الرموز المميزة للجلسة على تجميع مرحلتي طلب البحث والاختيار لبحث المستخدم في جلسة منفصلة لأغراض الفوترة. نقترح استخدام الرموز المميّزة للجلسة جميع جلسات الإكمال التلقائي. تبدأ الجلسة عندما يبدأ المستخدم في كتابة وينتهي عند تحديد مكان. يمكن أن تحتوي كل جلسة على العديد من متبوعة باختيار مكان واحد. بعد انتهاء الجلسة، لم يعد الرمز صالحًا؛ يجب أن يُنشئ تطبيقك رمزًا مميّزًا جديدًا لكل جلسة المراجعة.
أقنعة الحقل
يجب تحديد أنواع الأماكن في الطرق التي تعرض تفاصيل المكان. البيانات المطلوب عرضها مع كل طلب. يساعد ذلك في التأكد من أنك تطلب فقط (والدفع مقابل) البيانات التي ستستخدمها بالفعل.
لتحديد أنواع البيانات المطلوب عرضها، مرِّر مصفوفة من Place.Field
في
FetchPlaceRequest
، كما هو موضّح في المثال التالي:
// Include address, ID, and phone number.
List<Place.Field> placeFields = Arrays.asList(Place.Field.ADDRESS,
Place.Field.ID,
Place.Field.PHONE_NUMBER);
يمكنك استخدام حقل واحد أو أكثر من الحقول التالية:
Place.Field.ADDRESS
Place.Field.ID
Place.Field.LAT_LNG
Place.Field.NAME
Place.Field.OPENING_HOURS
Place.Field.PHONE_NUMBER
Place.Field.PHOTO_METADATAS
Place.Field.PLUS_CODE
Place.Field.PRICE_LEVEL
Place.Field.RATING
Place.Field.TYPES
Place.Field.USER_RATINGS_TOTAL
Place.Field.VIEWPORT
Place.Field.WEBSITE_URI
يمكنك الاطلاع على مزيد من المعلومات عن رموز التخزين التعريفية لبيانات الأماكن.
تحديثات "أداة اختيار الأماكن" و"الإكمال التلقائي"
يشرح هذا القسم التغييرات التي طرأت على أدوات الأماكن (منتقي الأماكن الإكمال التلقائي).
الإكمال التلقائي الآلي
تم إجراء التغييرات التالية على الإكمال التلقائي:
- تمت إعادة تسمية "
PlaceAutocomplete
" إلى "Autocomplete
".- تمت إعادة تسمية "
PlaceAutocomplete.getPlace
" إلى "Autocomplete.getPlaceFromIntent
". - تمت إعادة تسمية "
PlaceAutocomplete.getStatus
" إلى "Autocomplete.getStatusFromIntent
".
- تمت إعادة تسمية "
- تمت إعادة تسمية "
PlaceAutocomplete.RESULT_ERROR
" إلى "AutocompleteActivity.RESULT_ERROR
". (لم يتم تغيير معالجة الخطأ لجزء الإكمال التلقائي).
منتقي الأماكن
تم إيقاف "أداة اختيار الأماكن" في 29 كانون الثاني (يناير) 2019. تم إطفاء الجهاز 29 تموز (يوليو) 2019 ولم يعُد متاحًا. سيؤدي الاستخدام المستمر إلى رسالة خطأ. لا تتيح حزمة تطوير البرامج (SDK) الجديدة استخدام "أداة اختيار الأماكن".
التطبيقات المصغّرة للإكمال التلقائي
تم تحديث أدوات الإكمال التلقائي:
- تمت إزالة البادئة
Place
من جميع الصفوف. - تمت إضافة دعم الرموز المميزة للجلسة. الأداة تدير الرموز المميزة نيابةً عنك تلقائيًا في الخلفية.
- تمت إضافة دعم أقنعة الميدان، التي تتيح لك اختيار أنواع الأماكن البيانات التي سيتم إرجاعها بعد أن يقوم المستخدم بتحديدها.
توضح الأقسام التالية كيفية إضافة أداة إكمال تلقائي إلى مشروعك.
تضمين AutocompleteFragment
لإضافة جزء من الإكمال التلقائي، اتّبِع الخطوات التالية:
أضِف جزءًا إلى تنسيق XML للنشاط، كما هو موضّح في ما يلي مثال.
<fragment android:id="@+id/autocomplete_fragment" android:layout_width="match_parent" android:layout_height="wrap_content" android:name= "com.google.android.libraries.places.widget.AutocompleteSupportFragment" />
لإضافة أداة الإكمال التلقائي إلى النشاط، اتّبِع الخطوات التالية:
- يمكنك إعداد
Places
، وتمرير سياق التطبيق ومفتاح واجهة برمجة التطبيقات. - إعداد
AutocompleteSupportFragment
. - يمكنك الاتصال بالرقم
setPlaceFields()
للإشارة إلى أنواع بيانات الأماكن التي تريدها. الحصول عليها. - يمكنك إضافة
PlaceSelectionListener
لتنفيذ إجراء على النتيجة وكذلك والتعامل مع أي أخطاء قد تحدث.
يعرض المثال التالي إضافة أداة إكمال تلقائي إلى نشاط:
/** * Initialize Places. For simplicity, the API key is hard-coded. In a production * environment we recommend using a secure mechanism to manage API keys. */ if (!Places.isInitialized()) { Places.initialize(getApplicationContext(), "YOUR_API_KEY"); } // Initialize the AutocompleteSupportFragment. AutocompleteSupportFragment autocompleteFragment = (AutocompleteSupportFragment) getSupportFragmentManager().findFragmentById(R.id.autocomplete_fragment); autocompleteFragment.setPlaceFields(Arrays.asList(Place.Field.ID, Place.Field.NAME)); autocompleteFragment.setOnPlaceSelectedListener(new PlaceSelectionListener() { @Override public void onPlaceSelected(Place place) { // TODO: Get info about the selected place. Log.i(TAG, "Place: " + place.getName() + ", " + place.getId()); } @Override public void onError(Status status) { // TODO: Handle the error. Log.i(TAG, "An error occurred: " + status); } });
- يمكنك إعداد
استخدام نية لبدء نشاط الإكمال التلقائي
- إعداد
Places
، وتمرير سياق التطبيق ومفتاح واجهة برمجة التطبيقات - استخدِم
Autocomplete.IntentBuilder
لإنشاء هدف، وتمرير ما تريده. وضعPlaceAutocomplete
(ملء الشاشة أو العرض على سطح الصفحة) يجب أن يستدعي الغرضstartActivityForResult
، يتم إدخال رمز طلب يحدّد والنية. - يمكنك إلغاء معاودة الاتصال بنظام "
onActivityResult
" للحصول على المكان المحدّد.
يوضح المثال التالي كيفية استخدام نية لبدء تشغيل الإكمال التلقائي، ثم تتعامل مع النتيجة:
/**
* Initialize Places. For simplicity, the API key is hard-coded. In a production
* environment we recommend using a secure mechanism to manage API keys.
*/
if (!Places.isInitialized()) {
Places.initialize(getApplicationContext(), "YOUR_API_KEY");
}
...
// Set the fields to specify which types of place data to return.
List<Place.Field> fields = Arrays.asList(Place.Field.ID, Place.Field.NAME);
// Start the autocomplete intent.
Intent intent = new Autocomplete.IntentBuilder(
AutocompleteActivityMode.FULLSCREEN, fields)
.build(this);
startActivityForResult(intent, AUTOCOMPLETE_REQUEST_CODE);
...
/**
* Override the activity's onActivityResult(), check the request code, and
* do something with the returned place data (in this example its place name and place ID).
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == AUTOCOMPLETE_REQUEST_CODE) {
if (resultCode == RESULT_OK) {
Place place = Autocomplete.getPlaceFromIntent(data);
Log.i(TAG, "Place: " + place.getName() + ", " + place.getId());
} else if (resultCode == AutocompleteActivity.RESULT_ERROR) {
// TODO: Handle the error.
Status status = Autocomplete.getStatusFromIntent(data);
Log.i(TAG, status.getStatusMessage());
} else if (resultCode == RESULT_CANCELED) {
// The user canceled the operation.
}
}
}
لم تعد أداة اختيار الأماكن متاحة
تم إيقاف "أداة اختيار الأماكن" في 29 كانون الثاني (يناير) 2019. تم إطفاء الجهاز 29 تموز (يوليو) 2019 ولم يعُد متاحًا. سيؤدي الاستخدام المستمر إلى رسالة خطأ. لا تتيح حزمة تطوير البرامج (SDK) الجديدة استخدام "أداة اختيار الأماكن".