Files
pda-web/app/src/main/java/chaoran/business/activity/MainActivity.java
2023-06-12 17:52:13 +08:00

356 lines
13 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package chaoran.business.activity;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.hardware.SensorManager;
import android.media.MediaPlayer;
import android.os.Build;
import android.os.Bundle;
import android.os.Vibrator;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.OrientationEventListener;
import android.view.View;
import android.webkit.*;
import android.widget.ProgressBar;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import java.io.IOException;
import java.util.Map;
import chaoran.business.BrandEnum;
import chaoran.business.R;
import chaoran.business.adapter.*;
import chaoran.business.engine.impl.NetworkSettingEngine;
import chaoran.business.engine.SettingEngine;
import chaoran.business.engine.impl.TekVoiceEngine;
import chaoran.business.engine.VoiceEngine;
import chaoran.business.service.ScanServiceEDA50P;
import chaoran.business.service.ScanServiceZEBRA;
import chaoran.business.utils.LocalAddressUtil;
import chaoran.business.utils.StatusBarUtil;
/**
* 流程:联网认证设备型号,验证通过,查找设备品牌进行调用驱动操作
*/
/**
* 提供文字转语音功能实时播报PDA状态
*/
public class MainActivity extends AppCompatActivity implements ResultListener{
private WebView webView;
private Adapter adapter;
private VoiceEngine voiceEngine;
private SettingEngine settingEngine;
private ProgressBar progressBar;
private ActionBar actionBar;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initData();
//SCREEN_ORIENTATION_USER不能旋转1800、90、270都可以旋转
//SCREEN_ORIENTATION_FULL_SENSOR 都可以旋转,但是在不打开旋转的情况下,一样可以旋转
//SCREEN_ORIENTATION_FULL_USER 关闭旋转则不会旋转了
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_USER);
}
private void initData() {
BrandEnum brand = BrandEnum.code(Build.MANUFACTURER);
Toast.makeText(this, Build.MANUFACTURER, Toast.LENGTH_LONG).show();
Log.i("brand===",brand.toString());
switch (brand) {
case UROBO:
adapter = new UroBoAdapter(this, this);
break;
case ROCKCHIP:
adapter = new RockChipAdapter(this, this);
break;
case IDATA:
adapter = new IDataAdapter(this, this);
break;
case ALPS:
adapter = new AlpsAdapter(this, this);
break;
case HONEY_WELL_EDA50P:
case HONEY_WELL_EDA51:
adapter = new HoneywellAdapter(this, this);
break;
case ZEBRA_TECHNOLOGIES:
adapter = new ZebraAdapter(this, this);
case HISENSE:
adapter = new HisenseAdapter(this, this);
}
if (null != adapter) {
adapter.start();
}
}
@SuppressLint("JavascriptInterface")
private void initView() {
actionBar = getSupportActionBar();
voiceEngine = new TekVoiceEngine(this);
settingEngine = new NetworkSettingEngine(this);
webView = findViewById(R.id.webView);
progressBar = findViewById(R.id.loading);
webView.setWebViewClient(disposeView());
WebSettings settings = webView.getSettings();
settings.setJavaScriptEnabled(true);
// StatusBarUtil.transparencyBar( this); // 设置全部透明需要在页面设置一个参数进行布局的样式跳转不同的手机端状态栏高度不一样apk设置状态栏高度无效这个是安卓9的一个bug所以在此采取隐藏状态栏
StatusBarUtil.hideStatusBar( this); // 设置全部透明
//设置接口进行windows暴露
settings.setDomStorageEnabled(true);
//语音引擎
webView.addJavascriptInterface(voiceEngine, "TekVoiceEngine");
//网络设置展示
webView.addJavascriptInterface(settingEngine, "NetworkSettingEngine");
//重新加载页面
webView.addJavascriptInterface(this, "View");
webView.addJavascriptInterface(new LocalAddressUtil(this, this, webView), "Localpda");
webView.loadUrl(url());
}
//配置客户端
private WebViewClient disposeView() {
return new WebViewClient() {
//页面开始加载时
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
progressBar.setVisibility(View.VISIBLE);
}
//页面加载完成时
@Override
public void onPageFinished(WebView view, String url) {
if (!url.startsWith("file"))
actionBar.hide();
else
actionBar.show();
super.onPageFinished(view, url);
progressBar.setVisibility(View.INVISIBLE);
}
//网络发生错误时,先展示错误界面,然后关闭加载条
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
switch (errorCode) {
case 404:
webView.loadUrl("file:///android_asset/error/404.html");
break;
case 500:
webView.loadUrl("file:///android_asset/error/500.html");
break;
default:
webView.loadUrl("file:///android_asset/error/index.html");
}
actionBar.show();
actionBar.setTitle(R.string.title_activity_main);
super.onReceivedError(view, errorCode, description, failingUrl);
progressBar.setVisibility(View.INVISIBLE);
}
//安卓6.0以上发生错误时回调
@Override
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
switch (error.getErrorCode()) {
case 404:
webView.loadUrl("file:///android_asset/error/404.html");
break;
case 500:
webView.loadUrl("file:///android_asset/error/500.html");
break;
default:
webView.loadUrl("file:///android_asset/error/index.html");
}
}
actionBar.show();
actionBar.setTitle(R.string.title_activity_main);
super.onReceivedError(view, request, error);
progressBar.setVisibility(View.INVISIBLE);
}
};
}
@Override
protected void onResume() {
//再次唤醒该页面时,重新加载页面和语音配置
//webView.loadUrl(url());
// voiceEngine.reload();
super.onResume();
adapter.stop();
adapter.start();
}
@Override
@SuppressLint("SetJavaScriptEnabled")
public void result(String result) {
runOnUiThread(() -> webView.loadUrl("javascript:render(\'" + result + "\')"));
}
@Override
protected void onDestroy() {
adapter.stop();
super.onDestroy();
if (diPlayer != null) {
diPlayer.stop();
diPlayer.release();
diPlayer = null;
}
if (duPlayer != null) {
duPlayer.stop();
duPlayer.release();
duPlayer = null;
}
if (dingPlayer != null) {
dingPlayer.stop();
dingPlayer.release();
dingPlayer = null;
}
if (vibrator != null) {
vibrator.cancel();
}
completionListener = null;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.action_setting_network:
startActivity(new Intent(this, NetworkSettingActivity.class));
break;
case R.id.action_setting_voice:
startActivity(new Intent(this, VoiceSettingActivity.class));
break;
}
return super.onOptionsItemSelected(item);
}
//拼接url
private String url() {
SharedPreferences spf = this.getSharedPreferences("crtech", Context.MODE_PRIVATE);
Integer port = spf.getInt("port", -1);
if (port == -1) {
return "file:///android_asset/demo/index.html";
}
String address = spf.getString("address", "").replaceAll(" ", "");
String path = spf.getString("path", "").replaceAll(" ", "");
String link = address.concat(":").concat(String.valueOf(port)).concat(path);
return link.startsWith("http://") ? link : "http://".concat(link);
}
@JavascriptInterface
public void reload() {
runOnUiThread(() -> {
webView.loadUrl(url());
});
}
private MediaPlayer diPlayer = null;
private MediaPlayer duPlayer = null;
private MediaPlayer dingPlayer = null;
private String ttsNr;
public Vibrator vibrator;
@JavascriptInterface
public void play(String msg, String type, int isZd) throws IOException {
ttsNr = msg;
if ("1".equals(type)) {
if (diPlayer == null) {
diPlayer = MediaPlayer.create(this, R.raw.didi);
diPlayer.setOnCompletionListener(completionListener);
}
diPlayer.start();
} else if ("2".equals(type)) {
if (duPlayer == null) {
duPlayer = MediaPlayer.create(this, R.raw.dudu);
duPlayer.setOnCompletionListener(completionListener);
}
duPlayer.start();
} else if ("10".equals(type)) {
if (dingPlayer == null) {
dingPlayer = MediaPlayer.create(this, R.raw.ding);
dingPlayer.setOnCompletionListener(completionListener);
}
dingPlayer.start();
} else {
//isZd = 1;
if (voiceEngine != null) {
voiceEngine.startSpeaking(msg);
}
}
if (isZd == 1) {
if (vibrator == null) {
vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
}
vibrator.vibrate(2000);
}
}
private MediaPlayer.OnCompletionListener completionListener = new MediaPlayer.OnCompletionListener() {
// @Override
public void onCompletion(MediaPlayer mp) {
if (ttsNr != null) {
if (voiceEngine != null) {
voiceEngine.startSpeaking(ttsNr);
}
ttsNr = null;
}
}
};
/* 监听角度的变化
class MyOrientationDetector extends OrientationEventListener {
private int rotate;
public MyOrientationDetector(Context context) {
super(context);
}
@Override
public void onOrientationChanged(int orientation) {
//假设屏幕旋转被打开。则设置屏幕可旋转
//0-57度 125-236度 306-360度 这些区间范围内为竖屏
//58-124度 237-305度 这些区间范围内为横屏
if (orientation >=0 && orientation <= 57 ) {
rotate = 1; // 正竖屏
}else if (orientation >=125 && orientation <= 236 ) {
rotate = 2; // 倒竖屏
}else if (orientation >=306 && orientation <= 360 ) {
rotate = 1; // 正竖屏
}else if (orientation >=58 && orientation <= 124 ) {
rotate = 3; // 正横屏
}else if (orientation >=237 && orientation <= 305 ) {
rotate = 4; // 倒横屏
}else {
rotate = 1; // 默认正竖屏
}
System.out.println("屏幕旋转角度监控::" + rotate);
}
}*/
}