package chaoran.business.activity; import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.ActivityInfo; import android.content.res.AssetManager; import android.content.res.Configuration; import android.graphics.Bitmap; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.media.MediaPlayer; import android.os.Build; import android.os.Bundle; import android.os.Vibrator; import android.util.JsonReader; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.OrientationEventListener; import android.view.Surface; import android.view.View; import android.view.WindowManager; 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 com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.HashMap; import java.util.Map; import chaoran.business.BrandEnum; import chaoran.business.R; import chaoran.business.adapter.*; import chaoran.business.engine.entity.NetworkSetting; 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{ public static int SCREEN_ROTATION = 3; // 屏幕旋转的设置 public static int hideBar = 0; // 屏幕旋转的设置 MyOrientationDetector myOrientationDetector; 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,不能旋转180,0、90、270都可以旋转 //SCREEN_ORIENTATION_FULL_SENSOR 都可以旋转,但是在不打开旋转的情况下,一样可以旋转 //SCREEN_ORIENTATION_FULL_USER 关闭旋转则不会旋转了 this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_USER); myOrientationDetector = new MyOrientationDetector(this, this); myOrientationDetector.enable(); } public static String readInitFile(Context context) { StringBuffer init = new StringBuffer(); try { AssetManager assetManager = context.getAssets(); // 打开文件输入流 InputStream inputStream = assetManager.open("init.json"); // 使用BufferedReader进行逐行读取 BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); String line; while ((line = reader.readLine()) != null) { init.append(line); } reader.close(); } catch (IOException e) { Log.e("AssetError", "Failed to read asset file: init.json", e); } return init.toString(); } 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 SEUIC: adapter = new SeuicAdapter(this, this); break; case HONEY_WELL_EDA50P: // 51、56都是同一个code case HONEY_WELL_EDA51: if ( "eda50p".equals(Build.MODEL.toLowerCase()) || "eda51".equals(Build.MODEL.toLowerCase()) || "tc26".equals(Build.MODEL.toLowerCase()) ) { // 走服务模式 adapter = new HoneywellAdapter(this, this); }else { // 走广播模式 adapter = new HoneywellEda56Adapter(this, this); } break; case ZEBRA_TECHNOLOGIES: adapter = new ZebraAdapter(this, this); break; case HISENSE: adapter = new HisenseAdapter(this, this); break; case LACHESIS: adapter = new LachesisAdapter(this, this); break; case UROVO: adapter = new UrovoAdapter(this, this); break; case HKWS: adapter = new HkwsAdapter(this, this); break; case NEW_LAND: adapter = new NewlandAdapter(this, this); break; case IOT_DEVICE: adapter = new IOT_DeviceAdapter(this, this); break; case QUALCOMM: adapter = new QualcommAdapter(this, this); break; } 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); //设置接口进行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()); // StatusBarUtil.transparencyBar( this); // 设置全部透明,需要在页面设置一个参数进行布局的样式跳转,不同的手机端,状态栏高度不一样(apk设置状态栏高度无效,这个是安卓9的一个bug),所以在此采取隐藏状态栏 if (hideBar == 1) { StatusBarUtil.hideStatusBar( this); // 设置全部透明 } } //配置客户端 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(); if (adapter != null) { myOrientationDetector.disable(); adapter.stop2(); adapter.start(); } } @Override @SuppressLint("SetJavaScriptEnabled") public void result(String result) { runOnUiThread(() -> webView.loadUrl("javascript:render(\'" + result + "\')")); } @Override protected void onDestroy() { if (adapter != null) { 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); Map map = null; if (port == -1) { try { // String init = readInitFile(this); String init = null; if (init != null && init.length() > 0) { Gson gson = new Gson(); map = gson.fromJson(init, new TypeToken>(){}.getType()); // 说明采取了配置,并且存在ip才认为是一个合法的json配置 if (map.containsKey("ip") && map.get("ip").toString().length() > 0) { NetworkSetting initData = new NetworkSetting(); initData.setAddress(map.get("ip").toString()); initData.setPort(Integer.parseInt(map.get("port").toString())); initData.setPath(map.get("path").toString()); initData.setScreen_rotation(Integer.parseInt(map.getOrDefault("screen_rotation", "3").toString())); initData.setHide_bar(Integer.parseInt(map.getOrDefault("hide_bar", "3").toString())); settingEngine.saveSetting(initData); spf = this.getSharedPreferences("crtech", Context.MODE_PRIVATE); port = initData.getPort(); }else { map = null; } } }catch (Exception e) { Log.e("MainActivity", "get init file error"); } if (map == null) { 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); SCREEN_ROTATION = spf.getInt("screen_rotation", 3); hideBar = spf.getInt("hide_bar", 3); 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; } } }; @SuppressLint("JavascriptInterface") @JavascriptInterface public void openIndex() throws IOException { runOnUiThread(() -> { webView.loadUrl("file:///android_asset/demo/index.html"); }); } /* 监听角度的变化 */ class MyOrientationDetector extends OrientationEventListener { private int rotate; private Activity activity; public MyOrientationDetector(Context context, Activity activity) { super(context); this.activity = activity; } @Override public void onOrientationChanged(int orientation) { //假设屏幕旋转被打开。则设置屏幕可旋转 //0-57度 125-236度 306-360度 这些区间范围内为竖屏 //58-124度 237-305度 这些区间范围内为横屏 if (orientation >=0 && orientation <= 57 ) { rotate = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; // 正竖屏 }else if (orientation >=125 && orientation <= 236 ) { rotate = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT; // 倒竖屏 }else if (orientation >=306 && orientation <= 360 ) { rotate = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; // 正竖屏 }else if (orientation >=58 && orientation <= 124 ) { rotate = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE; // 正横屏 }else if (orientation >=237 && orientation <= 305 ) { rotate = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; // 倒横屏 }else { rotate = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; // 默认正竖屏 } if (SCREEN_ROTATION == 1 || SCREEN_ROTATION == 3) { if (rotate == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT || rotate == ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT) { activity.setRequestedOrientation(rotate); } } if (SCREEN_ROTATION == 2 || SCREEN_ROTATION == 3) { if (rotate == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE || rotate == ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE) { activity.setRequestedOrientation(rotate); } } } } @SuppressLint("WrongConstant") @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); } }