diff --git a/Android/app/src/main/java/pub/doric/demo/DemoActivity.java b/Android/app/src/main/java/pub/doric/demo/DemoActivity.java index ca7e91f4..2ebc5763 100644 --- a/Android/app/src/main/java/pub/doric/demo/DemoActivity.java +++ b/Android/app/src/main/java/pub/doric/demo/DemoActivity.java @@ -18,13 +18,11 @@ package pub.doric.demo; import android.os.Bundle; import android.view.KeyEvent; import android.view.ViewGroup; -import android.view.Window; import android.widget.FrameLayout; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; - import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; @@ -32,6 +30,7 @@ import org.greenrobot.eventbus.ThreadMode; import pub.doric.DoricContext; import pub.doric.DoricDriver; import pub.doric.dev.DevPanel; +import pub.doric.dev.SensorManagerHelper; import pub.doric.dev.event.EnterDebugEvent; import pub.doric.dev.event.QuitDebugEvent; import pub.doric.engine.ChangeEngineCallback; @@ -45,6 +44,7 @@ import pub.doric.utils.DoricUtils; public class DemoActivity extends AppCompatActivity { private DoricContext doricContext; private DevPanel devPanel = new DevPanel(); + private SensorManagerHelper sensorHelper; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { @@ -56,6 +56,17 @@ public class DemoActivity extends AppCompatActivity { doricContext = DoricContext.create(this, DoricUtils.readAssetFile("demo/" + source), source); doricContext.init(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); doricContext.getRootNode().setRootView(frameLayout); + + sensorHelper = new SensorManagerHelper(this); + sensorHelper.setOnShakeListener(new SensorManagerHelper.OnShakeListener() { + @Override + public void onShake() { + if (devPanel.isAdded()) { + return; + } + devPanel.show(getSupportFragmentManager(), "DevPanel"); + } + }); } @Override @@ -82,6 +93,7 @@ public class DemoActivity extends AppCompatActivity { super.onDestroy(); doricContext.teardown(); EventBus.getDefault().unregister(this); + sensorHelper.stop(); } @Subscribe(threadMode = ThreadMode.MAIN) diff --git a/Android/doric/src/main/java/pub/doric/dev/DevKit.java b/Android/doric/src/main/java/pub/doric/dev/DevKit.java index 4d75fcc6..c8f22358 100644 --- a/Android/doric/src/main/java/pub/doric/dev/DevKit.java +++ b/Android/doric/src/main/java/pub/doric/dev/DevKit.java @@ -6,7 +6,8 @@ import pub.doric.utils.DoricUtils; public class DevKit implements IDevKit { - public static boolean isRunningInEmulator = false; + static boolean isRunningInEmulator = false; + public static String ip = ""; private static class Inner { private static final DevKit sInstance = new DevKit(); diff --git a/Android/doric/src/main/java/pub/doric/dev/DevPanel.java b/Android/doric/src/main/java/pub/doric/dev/DevPanel.java index 54da8c9c..4b678f20 100644 --- a/Android/doric/src/main/java/pub/doric/dev/DevPanel.java +++ b/Android/doric/src/main/java/pub/doric/dev/DevPanel.java @@ -57,7 +57,8 @@ public class DevPanel extends BottomSheetDialogFragment { @Override public void onClick(View v) { if (DevKit.isRunningInEmulator) { - Doric.connectDevKit("ws://" + "10.0.2.2" + ":7777"); + DevKit.ip = "10.0.2.2"; + Doric.connectDevKit("ws://" + DevKit.ip + ":7777"); } else { final RxPermissions rxPermissions = new RxPermissions(DevPanel.this); Disposable disposable = rxPermissions diff --git a/Android/doric/src/main/java/pub/doric/dev/ScanQRCodeActivity.java b/Android/doric/src/main/java/pub/doric/dev/ScanQRCodeActivity.java index 0df9e81b..e93070ba 100644 --- a/Android/doric/src/main/java/pub/doric/dev/ScanQRCodeActivity.java +++ b/Android/doric/src/main/java/pub/doric/dev/ScanQRCodeActivity.java @@ -49,6 +49,7 @@ public class ScanQRCodeActivity extends AppCompatActivity implements QRCodeView. @Override public void onScanQRCodeSuccess(String result) { setTitle("扫描结果为:" + result); + DevKit.ip = result; Toast.makeText(this, "dev kit connecting to " + result, Toast.LENGTH_LONG).show(); Doric.connectDevKit("ws://" + result + ":7777"); finish(); diff --git a/Android/doric/src/main/java/pub/doric/dev/SensorManagerHelper.java b/Android/doric/src/main/java/pub/doric/dev/SensorManagerHelper.java new file mode 100644 index 00000000..b4258c44 --- /dev/null +++ b/Android/doric/src/main/java/pub/doric/dev/SensorManagerHelper.java @@ -0,0 +1,113 @@ +package pub.doric.dev; + +import android.content.Context; +import android.hardware.Sensor; +import android.hardware.SensorEvent; +import android.hardware.SensorEventListener; +import android.hardware.SensorManager; + +public class SensorManagerHelper implements SensorEventListener { + + // 速度阈值,当摇晃速度达到这值后产生作用 + private final int SPEED_SHRESHOLD = 5000; + // 两次检测的时间间隔 + private final int UPTATE_INTERVAL_TIME = 50; + // 传感器管理器 + private SensorManager sensorManager; + // 传感器 + private Sensor sensor; + // 重力感应监听器 + private OnShakeListener onShakeListener; + // 上下文对象context + private Context context; + // 手机上一个位置时重力感应坐标 + private float lastX; + private float lastY; + private float lastZ; + // 上次检测时间 + private long lastUpdateTime; + + public SensorManagerHelper(Context context) { + this.context = context; + start(); + } + + /** + * 开始检测 + */ + public void start() { + // 获得传感器管理器 + sensorManager = (SensorManager) context + .getSystemService(Context.SENSOR_SERVICE); + if (sensorManager != null) { + // 获得重力传感器 + sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); + } + // 注册 + if (sensor != null) { + sensorManager.registerListener(this, sensor, + SensorManager.SENSOR_DELAY_GAME); + } + } + + /** + * 停止检测 + */ + public void stop() { + sensorManager.unregisterListener(this); + } + + /** + * 摇晃监听接口 + */ + public interface OnShakeListener { + void onShake(); + } + + /** + * 设置重力感应监听器 + */ + public void setOnShakeListener(OnShakeListener listener) { + onShakeListener = listener; + } + + @Override + public void onAccuracyChanged(Sensor sensor, int accuracy) { + } + + /** + * 重力感应器感应获得变化数据 + * android.hardware.SensorEventListener#onSensorChanged(android.hardware + * .SensorEvent) + */ + @Override + public void onSensorChanged(SensorEvent event) { + // 现在检测时间 + long currentUpdateTime = System.currentTimeMillis(); + // 两次检测的时间间隔 + long timeInterval = currentUpdateTime - lastUpdateTime; + // 判断是否达到了检测时间间隔 + if (timeInterval < UPTATE_INTERVAL_TIME) return; + // 现在的时间变成last时间 + lastUpdateTime = currentUpdateTime; + // 获得x,y,z坐标 + float x = event.values[0]; + float y = event.values[1]; + float z = event.values[2]; + // 获得x,y,z的变化值 + float deltaX = x - lastX; + float deltaY = y - lastY; + float deltaZ = z - lastZ; + // 将现在的坐标变成last坐标 + lastX = x; + lastY = y; + lastZ = z; + double speed = Math.sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ + * deltaZ) + / timeInterval * 10000; + // 达到速度阀值,发出提示 + if (speed >= SPEED_SHRESHOLD) { + onShakeListener.onShake(); + } + } +} diff --git a/Android/doric/src/main/java/pub/doric/engine/remote/RemoteJSExecutor.java b/Android/doric/src/main/java/pub/doric/engine/remote/RemoteJSExecutor.java index 0093121d..75a96342 100644 --- a/Android/doric/src/main/java/pub/doric/engine/remote/RemoteJSExecutor.java +++ b/Android/doric/src/main/java/pub/doric/engine/remote/RemoteJSExecutor.java @@ -37,13 +37,7 @@ public class RemoteJSExecutor { .readTimeout(10, TimeUnit.SECONDS) .writeTimeout(10, TimeUnit.SECONDS) .build(); - String ip; - if (DevKit.isRunningInEmulator) { - ip = "10.0.2.2"; - } else { - ip = "192.168.24.79"; - } - final Request request = new Request.Builder().url("ws://" + ip + ":2080").build(); + final Request request = new Request.Builder().url("ws://" + DevKit.ip + ":2080").build(); final Thread current = Thread.currentThread(); webSocket = okHttpClient.newWebSocket(request, new WebSocketListener() {