跳到主要内容

隐私管理

1. 隐私权限检查​

详见宿主隐私协议接入

接口原型​

void setPrivacyChecker(PrivacyChecker checker)

2. 宿主隐私协议接入​

功能介绍​

为了规范开发者调用系统能力的行为,如相机,蓝牙,传感器等。宿主给第三方接入平台提供了权限检查的异步调用接口,第三方平台可以在接口中检查或引导用户授予相关权限。

接入说明​

  1. 实现 PrivacyChecker 接口,其中 methodName 的可能值见下节 相关 API 部分。
public interface PrivacyChecker {
void requirePrivacy(String methodName, PrivacyCallback callback);
}
  1. PrivacyChecker 回调中的 PrivacyCallback 和 PrivacyResult 定义如下,参数:
    1. methodName 为传入的 methodName;
    2. passed 表示是否检查通过;
    3. errorNo 和 errorMessage 会返回给相关 js 中的调用。
public interface PrivacyCallback {
void onPrivacyResult(String methodName, PrivacyResult privacyResult);
}

public class PrivacyResult {
private boolean passed;
private int errorNo;
private String errorMessage;

public PrivacyResult(boolean passed, int errNo, String errMsg) {
this.passed = passed;
this.errorNo = errNo;
this.errorMessage = errMsg;
}

public boolean isPassed() {
return passed;
}
public void setPassed(boolean passed) {
this.passed = passed;
}

public int getErrorNo() {
return errorNo;
}
public void setErrorNo(int errorNo) {
this.errorNo = errorNo;
}

public String getErrorMessage() {
return errorMessage;
}
public void setErrorMessage(String errorMessage) {
this.errorMessage = errorMessage;
}
}
  1. 通过 TJGameHandle 传入自定义的 PrivacyChecker。
private TJHostHandle hostHandle;
hostHandle.setPrivacyChecker(new RandomPrivacyChecker());

3. 相关 API​

信息类型methodName说明
麦克风startRecorderManagerRecorderManager.start
摄像头startCameraManagertj.createCamera
蓝牙openBluetoothAdapter, createBLEPeripheralServertj.openBluetoothAdapter, tj.createBLEPeripheralServer
陀螺仪传感器startGyroscopetj.startGyroscope
方向传感器startDeviceMotionListeningtj.startDeviceMotionListening
磁场传感器startCompasstj.startCompass
加速传感器startAccelerometertj.startAccelerometer

4. 示例​

一个返回随机结果的 PrivacyChecker。

public class RandomPrivacyChecker implements PrivacyChecker {
private static final String TAG = "RandomPrivacyChecker";
private PrivacyResult randomResult() {
int random = (int) (Math.random() * 10);
if (random < 5) {
return new PrivacyResult(true, 0, "privacy granted");
} else {
return new PrivacyResult(false, 1, "privacy denied");
}
}

@Override
public void requirePrivacy(String methodName, PrivacyCallback callback) {
try {
Thread.sleep(500); // 模拟耗时操作
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
if (callback != null) {
PrivacyResult result = randomResult();
Log.d(TAG, "requirePrivacy: " + methodName + " " + result.getErrorMessage());
callback.onPrivacyResult(methodName, result);
}
}
}