活动识别API服务开发
活動(dòng)識(shí)別API服務(wù)開(kāi)發(fā)
要使用華為活動(dòng)識(shí)別服務(wù)API,需要確保設(shè)備已經(jīng)下載并安裝了HMS Core(APK),并將Location Kit的SDK集成到項(xiàng)目中。
指定應(yīng)用權(quán)限
? 在Android Q以下版本使用活動(dòng)識(shí)別需要在“AndroidManifest.xml”文件中配置以下權(quán)限:
a.
? 在Android Q及以上版本中,需要在“AndroidManifest.xml”文件中申請(qǐng)以下權(quán)限:
.
說(shuō)明
以上活動(dòng)識(shí)別相關(guān)權(quán)限屬于危險(xiǎn)權(quán)限,使用時(shí)需要?jiǎng)討B(tài)申請(qǐng)。
注冊(cè)靜態(tài)廣播
示例代碼中活動(dòng)識(shí)別服務(wù)的活動(dòng)狀態(tài)更新信息需要廣播接收,因此需要在“AndroidManifest.xml”文件中注冊(cè)廣播接收器。
- <receiver
-
android:name=".location.fusedlocation.LocationBroadcastReceiver" -
android:exported="true"> -
<intent-filter> -
<action android:name="com.huawei.hmssample.location.LocationBroadcastReceiver.ACTION_PROCESS_LOCATION" /> -
</intent-filter>
創(chuàng)建活動(dòng)識(shí)別服務(wù)客戶端
在Activity的OnCreate()方法中創(chuàng)建一個(gè)ActivityIdentificationService實(shí)例,通過(guò)該實(shí)例調(diào)用活動(dòng)識(shí)別相關(guān)接口:
- private PendingIntent pendingIntent;
- private ActivityIdentificationService activityIdentificationService;
- protected void onCreate(Bundle savedInstanceState) {
-
// 通過(guò)ActivityIdentification.getService()創(chuàng)建activityIdentificationService實(shí)例 -
activityIdentificationService = ActivityIdentification.getService(this); -
// 獲取PendingIntent對(duì)象 -
pendingIntent = getPendingIntent(); - }
活動(dòng)識(shí)別更新
使用活動(dòng)識(shí)別服務(wù),首先需要注冊(cè)活動(dòng)識(shí)別更新,可以檢測(cè)用戶當(dāng)前是步行、騎自行車、靜止等狀態(tài)。 - 新建PendingIntent。
- // 獲取自定義靜態(tài)廣播類LocationBroadcastReceiver關(guān)聯(lián)的PendingIntent
- private PendingIntent getPendingIntent() {
-
Intent intent = new Intent(this, LocationBroadcastReceiver.class); -
intent.setAction(LocationBroadcastReceiver.ACTION_PROCESS_LOCATION); -
return PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); - }
- 監(jiān)聽(tīng)活動(dòng)識(shí)別更新請(qǐng)求。
通過(guò)調(diào)用createActivityIdentificationUpdates(long detectionIntervalMillis, PendingIntent callbackIntent)方法,第一個(gè)參數(shù)為活動(dòng)檢測(cè)更新間隔(單位為毫秒),第二個(gè)參數(shù)pendingIntent。 - // 創(chuàng)建活動(dòng)識(shí)別請(qǐng)求
- activityIdentificationService.createActivityIdentificationUpdates(5000, pendingIntent)
-
// 請(qǐng)求成功監(jiān)聽(tīng)回調(diào) -
.addOnSuccessListener(new OnSuccessListener<Void>() { -
@Override -
public void onSuccess(Void aVoid) { -
Log.i(TAG, "createActivityIdentificationUpdates onSuccess"); -
} -
}) -
// 請(qǐng)求失敗監(jiān)聽(tīng)回調(diào) -
.addOnFailureListener(new OnFailureListener() { -
@Override -
public void onFailure(Exception e) { -
Log.e(TAG, "createActivityIdentificationUpdates onFailure:" + e.getMessage()); -
} -
}); - 移除活動(dòng)識(shí)別更新。
在使用完活動(dòng)識(shí)別后需要進(jìn)行移除操作。調(diào)用deleteActivityIdentificationUpdates(PendingIntent pendingIntent)移除活動(dòng)識(shí)別定時(shí)監(jiān)聽(tīng),參數(shù)PendingIntent必須與createActivityIdentificationUpdates(long detectionIntervalMillis, PendingIntent callbackIntent)參數(shù)里的PendingIntent是同一個(gè)。 - // 移除活動(dòng)識(shí)別更新
- activityIdentificationService.deleteActivityIdentificationUpdates(pendingIntent)
-
// 移除回調(diào)成功監(jiān)聽(tīng)回調(diào) -
.addOnSuccessListener(new OnSuccessListener<Void>() { -
@Override -
public void onSuccess(Void aVoid) { -
Log.i(TAG, "deleteActivityIdentificationUpdates onSuccess"); -
} -
}) -
// 移除回調(diào)失敗監(jiān)聽(tīng)回調(diào) -
.addOnFailureListener(new OnFailureListener() { -
@Override -
public void onFailure(Exception e) { -
Log.e(TAG, "deleteActivityIdentificationUpdates onFailure:" + e.getMessage()); -
} -
}); - 活動(dòng)識(shí)別結(jié)果獲取。
通過(guò)廣播接收到的intent中獲取活動(dòng)識(shí)別結(jié)果。 - // 活動(dòng)識(shí)別廣播接收者
- public class LocationBroadcastReceiver extends BroadcastReceiver {
-
// 活動(dòng)識(shí)別服務(wù)廣播action -
public static final String ACTION_PROCESS_LOCATION = "com.huawei.hms.location.ACTION_PROCESS_LOCATION"; -
@Override -
public void onReceive(Context context, Intent intent) { -
if (intent != null) { -
final String action = intent.getAction(); -
if (ACTION_PROCESS_LOCATION.equals(action)) { -
// 從活動(dòng)識(shí)別服務(wù)發(fā)送的intent的extras中獲取ActivityIdentificationResponse -
ActivityIdentificationResponse activityIdentificationResponse = ActivityIdentificationResponse.getDataFromIntent(intent); -
List<ActivityIdentificationData> list = activityIdentificationResponse.getActivityIdentificationDatas(); -
} -
} -
} - }
活動(dòng)過(guò)渡更新
接口提供檢測(cè)活動(dòng)過(guò)渡條件(進(jìn)入、退出)的功能,例如需要檢測(cè)用戶從走路變?yōu)轵T自行車的狀態(tài)時(shí),應(yīng)用通過(guò)調(diào)用createActivityConversionUpdates(ActivityConversionRequest request, PendingIntent pendingIntent)方法獲取活動(dòng)過(guò)渡的狀態(tài)變化。 - 設(shè)置監(jiān)聽(tīng)活動(dòng)過(guò)渡請(qǐng)求參數(shù)。
- // 創(chuàng)建一個(gè)靜止?fàn)顟B(tài)進(jìn)入活動(dòng)轉(zhuǎn)換信息對(duì)象
- ActivityConversionInfo activityConversionInfoStillEnter = new ActivityConversionInfo(ActivityIdentificationData.STILL, ActivityConversionInfo.ENTER_ACTIVITY_CONVERSION);
- // 創(chuàng)建一個(gè)靜止?fàn)顟B(tài)退出活動(dòng)轉(zhuǎn)換信息對(duì)象
- ActivityConversionInfo activityConversionInfoStillExit = new ActivityConversionInfo(ActivityIdentificationData.STILL, ActivityConversionInfo.EXIT_ACTIVITY_CONVERSION);
- List activityConversionInfos = new ArrayList<>();
- activityConversionInfos.add(activityConversionInfoStillEnter);
- activityConversionInfos.add(activityConversionInfoStillExit);
- // 創(chuàng)建一個(gè)活動(dòng)轉(zhuǎn)換請(qǐng)求體實(shí)例
- ActivityConversionRequest request = new ActivityConversionRequest();
- request.setActivityConversions(activityConversionInfos);
- 監(jiān)聽(tīng)活動(dòng)過(guò)渡更新。
- // 監(jiān)聽(tīng)活動(dòng)識(shí)別狀態(tài)轉(zhuǎn)換
- Task task = activityIdentificationService.createActivityConversionUpdates(request, pendingIntent);
- // 任務(wù)成功監(jiān)聽(tīng)回調(diào)
- task.addOnSuccessListener(new OnSuccessListener() {
-
@Override -
public void onSuccess(Void aVoid) { -
Log.i(TAG, "createActivityConversionUpdates onSuccess"); -
} -
}) -
// 任務(wù)失敗監(jiān)聽(tīng)回調(diào) -
.addOnFailureListener(new OnFailureListener() { -
@Override -
public void onFailure(Exception e) { -
Log.e(TAG, "createActivityConversionUpdates onFailure:" + e.getMessage()); -
} -
}); - (可選)移除活動(dòng)過(guò)渡更新。
不需要監(jiān)聽(tīng)活動(dòng)過(guò)渡條件時(shí),需要調(diào)用deleteActivityConversionUpdates(PendingIntent pendingIntent)進(jìn)行移除操作。 - // 通過(guò)指定pendingIntent移除活動(dòng)轉(zhuǎn)換更新
- activityIdentificationService.deleteActivityConversionUpdates(pendingIntent)
-
// 移除更新成功監(jiān)聽(tīng)回調(diào) -
.addOnSuccessListener(new OnSuccessListener<Void>() { -
@Override -
public void onSuccess(Void aVoid) { -
Log.i(TAG, "deleteActivityConversionUpdates onSuccess"); -
} -
}) -
// 移除更新失敗監(jiān)聽(tīng)回調(diào) -
.addOnFailureListener(new OnFailureListener() { -
@Override -
public void onFailure(Exception e) { -
Log.e(TAG, "deleteActivityConversionUpdates onFailure:" + e.getMessage()); -
} -
}); - 返回結(jié)果獲取。
活動(dòng)過(guò)渡的結(jié)果: - public class LocationBroadcastReceiver extends BroadcastReceiver {
-
public static final String ACTION_PROCESS_LOCATION = "com.huawei.hms.location.ACTION_PROCESS_LOCATION"; -
@Override -
public void onReceive(Context context, Intent intent) { -
if (intent != null) { -
final String action = intent.getAction(); -
if (ACTION_PROCESS_LOCATION.equals(action)) { -
// 從intent中獲取ActivityConversionResponse -
ActivityConversionResponse activityConversionResponse = ActivityConversionResponse.getDataFromIntent(intent); -
List<ActivityConversionData> list = activityConversionResponse.getActivityConversionDatas(); -
} -
} -
} - }
說(shuō)明
海外版本手機(jī)活動(dòng)識(shí)別不支持騎行和乘車。
總結(jié)
以上是生活随笔為你收集整理的活动识别API服务开发的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 定位服务API案例
- 下一篇: 地理围栏API服务开发