小米开发平台小米计步器接口适配说明
1.小米计步器简介
收集手机中传感器的数据,通过机器学习算法判断步数。
1.1 算法说明
- 计步器Sensor 5分钟上报一次数据,后台Service将计步数据记录插入本地数据库,若没有数据上报, 则不插入;
- app第一次请求数据会立即响应, 后台Service会立即返回给app最新的记录数据;
- app在1分钟内多次请求数据, 则只有第一次得到的数据是最新的, 后面的请求结果和第一次相同;
- 一条记录只有一种计步模式.。例如, 用户在10分钟内有600步数据, 400步走路, 200步跑步, 则这10分钟会分拆成两条记录, 400步走路和200步跑步;
- 只传给应用层3种计步模式: 0: 不支持(在不支持计步的手机上不会得到数据), 2: 走路, 3: 跑步。
2.计步器接入
2.1 判断本机是否支持计步
使用miui.util.FeatureParser提供的接口去判断是否支持stepsProvider功能
//示例code
//在项目中新建一个工具类,FeatureParser,通过反射机制来获取miui.util.FeatureParser
public class FeatureParser {
public static boolean getBoolean(String name, boolean defaultValue) {
try {
Class featureParserClass = Class.forName("miui.util.FeatureParser");
Method method = featureParserClass.getMethod("getBoolean", String.class, boolean.class);
return (Boolean) method.invoke(null, name, defaultValue);
} catch (Exception e) {
e.printStackTrace();
}
return defaultValue;
}
}
//在功能开始之前判断是否支持stepsProvider功能
boolean isSupport= FeatureParser.getBoolean("support_steps_provider",false);
2.2 App采用ContentProvider的query请求获取计步数据
接口格式云app生成:
Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
参数 | 必选 | 类型 | 范围 | 说明 |
uri | true | android.net.Uri | Uri.parse(“content://” + “com.miui.providers.steps” + “/item”); | 取固定值 |
projection | false | String[] | 可选列: “_id”, “_begin_time”, “_end_time”, “_mode”, “_steps” | 获取指定列, 若为null则获取所有列 |
selection | false | String | 从可选列中选取自定义条件 | 获取满足条件的记录行, 若为null则获取所有行 |
selectionArgs | false | String[] | 一般为可选列的值 | Selection中带?的格式化参数 |
sortOrder | false | String | 从可选列中选取列升序(asc)或降序(desc), 可多个并列 | 返回结果的记录行排序方式, 若为null则按id大小排序 |
2.3 返回结果: 满足查询条件的记录行
记录行的数据结构如下
public class Step {
private int mId; // 记录在sqlite的id
private long mBeginTime; // 计步开始时间
private long mEndTime; // 计步结束时间
private int mMode; // 计步模式: 0:不支持模式, 1:静止, 2:走路, 3:跑步, 11:骑车, 12:交通工具
private int mSteps; // 总步数
}
3.代码示例
3.1 AndroidManifest.xml中声明权限
<uses-permission android:name=”miui.permission.READ_STEPS” />(不声明权限无法读取计步数据)。
3.2 Query用到的数据结构
public class Steps {
/* Data Field */
public static final String ID = "_id";
public static final String BEGIN_TIME = "_begin_time";
public static final String END_TIME = "_end_time";
// 0: NOT SUPPORT 1:REST 2:WALKING 3:RUNNING
public static final String MODE = "_mode";
public static final String STEPS = "_steps";
/* Default sort order */
public static final String DEFAULT_SORT_ORDER = "_id asc";
/* Authority */
public static final String AUTHORITY = "com.miui.providers.steps";
/* Content URI */
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/item");
}
public static String[] projection = new String[] {
Steps.ID,
Steps.BEGIN_TIME,
Steps.END_TIME,
Steps.MODE,
Steps.STEPS
};
3.3 返回结果的数据结构
public class Step {
private int id;
private long mBeginTime;
private long mEndTime;
private int mMode;
private int mSteps;
}
3.4 查询方法示例
public LinkedLisapp生成软件t<Step> getAllSteps(String selection, String[] args) {
LinkedList<Step> steps = new LinkedList<Step>();
Cursor cursor = resolver.query(Steps.CONTENT_URI, projection, selection, args,
Steps.DEFAULT_SORT_ORDER);
if (cursor.moveToFirst()) {
do {
Step s = new Step(cursor.getInt(0), cursor.getLong(1), cursor.getLong(2),
cursor.getInt(3),
cursor.getInt(4));
steps.add(s);
} while (cursor.moveToNext());
}
return steps;
}
编辑:yimen,如若转载,请注明出处:https://www.yimenapp.com/kb-yimen/12524/
部分内容来自网络投稿,如有侵权联系立删