diff --git a/app/src/main/java/com/mogo/launcher/MogoApplication.java b/app/src/main/java/com/mogo/launcher/MogoApplication.java index ce52cbb721..543b2224d9 100644 --- a/app/src/main/java/com/mogo/launcher/MogoApplication.java +++ b/app/src/main/java/com/mogo/launcher/MogoApplication.java @@ -318,18 +318,6 @@ public class MogoApplication extends AbsMogoApplication { // } ARouter.getInstance().navigation(ITestCrashReportProvider.class); Log.i("timer", "cost " + (System.currentTimeMillis() - start) + "ms"); -// try { -// if (DebugConfig.getCarMachineType() == DebugConfig.CAR_MACHINE_TYPE_LENOVO) { -// Intent intent = new Intent(); -// intent.setComponent(new ComponentName("com.zhidao.speech", -// "com.zhidao.speech.MainActivity")); -// intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); -// startActivity(intent); -// } -// } catch (Exception e) { -// e.printStackTrace(); -// } -// } @Override diff --git a/app2/build/jrebel/project-cleaned.marker b/app2/build/jrebel/project-cleaned.marker deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/foudations/mogo-commons/src/main/java/com/mogo/commons/mvp/MvpActivity.java b/foudations/mogo-commons/src/main/java/com/mogo/commons/mvp/MvpActivity.java index aa8d5fd980..b780448869 100644 --- a/foudations/mogo-commons/src/main/java/com/mogo/commons/mvp/MvpActivity.java +++ b/foudations/mogo-commons/src/main/java/com/mogo/commons/mvp/MvpActivity.java @@ -5,6 +5,7 @@ import android.content.Context; import android.content.Intent; import android.os.Build; import android.os.Bundle; +import android.provider.Settings; import android.view.MotionEvent; import android.view.View; import android.view.Window; @@ -18,6 +19,8 @@ import androidx.appcompat.app.AppCompatDelegate; import com.mogo.commons.debug.DebugConfig; import com.mogo.skin.support.MogoSkinManager; import com.mogo.utils.SoftKeyBoardJobber; +import com.mogo.utils.logger.Logger; +import com.mogo.utils.permissions.PermissionsDialogUtils; /** * @author congtaowang @@ -28,6 +31,8 @@ import com.mogo.utils.SoftKeyBoardJobber; public abstract class MvpActivity< V extends IView, P extends Presenter< V > > extends AppCompatActivity implements IView { + protected static final String TAG = "MvpActivity"; + protected P mPresenter; @Override @@ -42,21 +47,30 @@ public abstract class MvpActivity< V extends IView, P extends Presenter< V > > initViews(); mPresenter = createPresenter(); getLifecycle().addObserver( mPresenter ); + //申请悬浮窗权限 + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + // 检查是否有悬浮窗权限 + if (Settings.canDrawOverlays(this)) { + startVoicePad(); + } + } else { + startVoicePad(); + } } @Override protected void onResume() { super.onResume(); hideBottomUIMenu(); - startVoicePad(); } /** * 在Pad上拉起语音 */ - private void startVoicePad() { + public void startVoicePad() { try { if (DebugConfig.getCarMachineType() == DebugConfig.CAR_MACHINE_TYPE_LENOVO) { + Logger.d(TAG, "启动小智语音"); Intent intent = new Intent(); intent.setComponent(new ComponentName("com.zhidao.speech", "com.zhidao.speech.MainActivity")); diff --git a/foudations/mogo-utils/src/main/java/com/mogo/utils/permissions/PermissionsDialogUtils.java b/foudations/mogo-utils/src/main/java/com/mogo/utils/permissions/PermissionsDialogUtils.java new file mode 100644 index 0000000000..fecc8e5309 --- /dev/null +++ b/foudations/mogo-utils/src/main/java/com/mogo/utils/permissions/PermissionsDialogUtils.java @@ -0,0 +1,59 @@ +package com.mogo.utils.permissions; + +import android.app.Activity; +import android.app.AlertDialog; +import android.content.Context; +import android.content.Intent; +import android.net.Uri; +import android.os.Build; +import android.provider.Settings; +import android.text.TextUtils; + +/** + * @author xiaoyuzhou + * @date 2021/7/22 4:57 下午 + */ +public class PermissionsDialogUtils { + + public static AlertDialog mAlertDialog; + + + /** + * 打开APP的详情设置 + */ + public static void openAppDetails(Activity activity, String msg, int CODE_WINDOW) { + if (mAlertDialog == null || !mAlertDialog.isShowing()) { + AlertDialog.Builder builder = new AlertDialog.Builder(activity); + if (TextUtils.isEmpty(msg)) { + builder.setMessage("请在 “应用信息 -> 权限” 中授予权限"); + } else { + builder.setMessage("请在 “应用信息 -> 权限” 中授予【" + msg + "】权限"); + } + builder.setPositiveButton("手动授权", (dialog, which) -> { + Intent intent = new Intent(); + intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); + intent.addCategory(Intent.CATEGORY_DEFAULT); + intent.setData(Uri.parse("package:" + activity.getPackageName())); + intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); + intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); + activity.startActivityForResult(intent, CODE_WINDOW); + }); + builder.setCancelable(false); + mAlertDialog = builder.show(); + } + } + + /** + * 跳转浮层权限获取页面 + * + * @param activity + * @param CODE_WINDOW + */ + public static void openOverlayPermission(Activity activity, int CODE_WINDOW) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + activity.startActivityForResult(new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, + Uri.parse("package:" + activity.getPackageName())), CODE_WINDOW); + } + } + +} diff --git a/modules/mogo-module-main/src/main/java/com/mogo/module/main/MainActivity.java b/modules/mogo-module-main/src/main/java/com/mogo/module/main/MainActivity.java index bdac502fa0..e0ec16d265 100644 --- a/modules/mogo-module-main/src/main/java/com/mogo/module/main/MainActivity.java +++ b/modules/mogo-module-main/src/main/java/com/mogo/module/main/MainActivity.java @@ -1,14 +1,10 @@ package com.mogo.module.main; -import android.app.AlertDialog; -import android.content.DialogInterface; import android.content.Intent; import android.content.pm.PackageManager; -import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.provider.Settings; -import android.text.TextUtils; import android.util.Log; import android.view.View; import android.widget.FrameLayout; @@ -43,6 +39,7 @@ import com.mogo.service.statusmanager.StatusDescriptor; import com.mogo.skin.support.SkinMode; import com.mogo.utils.NetworkUtils; import com.mogo.utils.logger.Logger; +import com.mogo.utils.permissions.PermissionsDialogUtils; import com.zhidao.adasconfig.api.AdasConfigApiController; import com.zhidao.adasconfig.common.log.LoggerController; import com.zhidao.autopilot.support.api.AutopilotServiceManage; @@ -148,9 +145,7 @@ public class MainActivity extends MvpActivity implement if (Settings.canDrawOverlays(this)) { return; } -// Intent intent=new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION); -// startActivityForResult(intent, REQUEST_CODE_DIALOG); - openAppDetails("显示悬浮窗"); + PermissionsDialogUtils.openAppDetails(this, "显示悬浮窗", REQUEST_CODE_DIALOG); } } @@ -468,43 +463,27 @@ public class MainActivity extends MvpActivity implement } else { // 弹出对话框告诉用户需要权限的原因, 并引导用户去应用权限管理中手动打开权限按钮 if (!isFirst) { - openAppDetails(null); + PermissionsDialogUtils.openAppDetails(this, null, REQUEST_CODE_DIALOG); isFirst = true; } } } } - /** - * 打开APP的详情设置 - */ - private void openAppDetails(String msg) { - AlertDialog.Builder builder = new AlertDialog.Builder(this); - if (TextUtils.isEmpty(msg)) { - builder.setMessage("请在 “应用信息 -> 权限” 中授予权限"); - } else { - builder.setMessage("请在 “应用信息 -> 权限” 中授予【" + msg + "】权限"); - } - builder.setPositiveButton("手动授权", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - Intent intent = new Intent(); - intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); - intent.addCategory(Intent.CATEGORY_DEFAULT); - intent.setData(Uri.parse("package:" + getPackageName())); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); - intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); - startActivity(intent); - } - }); - builder.setNegativeButton("取消", null); - builder.show(); - } - @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); - + Logger.d(TAG, "requestCode: " + requestCode + " resultCode: " + resultCode); + if (requestCode == REQUEST_CODE_DIALOG) { + //申请悬浮窗权限 + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + // 检查是否有悬浮窗权限 + if (Settings.canDrawOverlays(this)) { + startVoicePad(); + } + } else { + startVoicePad(); + } + } } } diff --git a/tts/tts-pad/src/main/java/com/mogo/tts/pad/PadTTS.java b/tts/tts-pad/src/main/java/com/mogo/tts/pad/PadTTS.java index 3598d85479..acec3188fe 100644 --- a/tts/tts-pad/src/main/java/com/mogo/tts/pad/PadTTS.java +++ b/tts/tts-pad/src/main/java/com/mogo/tts/pad/PadTTS.java @@ -2,6 +2,8 @@ package com.mogo.tts.pad; import android.content.Context; import android.content.Intent; +import android.os.Build; +import android.provider.Settings; import android.text.TextUtils; import com.alibaba.android.arouter.facade.annotation.Route; @@ -11,6 +13,7 @@ import com.mogo.tts.base.MogoTTSConstants; import com.mogo.tts.base.PreemptType; import com.mogo.utils.AppUtils; import com.mogo.utils.logger.Logger; +import com.mogo.utils.permissions.PermissionsDialogUtils; import com.zhidao.auto.platform.voice.VoiceClient; import com.zhidao.voicesdk.MogoVoiceManager; import com.zhidao.voicesdk.MogoVoiceManagerImpl; @@ -34,7 +37,7 @@ public @Route( path = MogoTTSConstants.API_PATH ) class PadTTS implements IMogoTTS, VoiceClient.VoiceCmdCallBack, OnTtsListener { - private static final String TAG = "ZhiTTS"; + private static final String TAG = "PadTTS"; private String mLastQAndASpeakText; private boolean mHasFlush = false; @@ -48,6 +51,7 @@ class PadTTS implements IMogoTTS, VoiceClient.VoiceCmdCallBack, OnTtsListener { try { mVoiceClient.unRegisterCustomWakeupCmd( cmd ); } catch ( Exception e ) { + e.printStackTrace(); } } } @@ -79,6 +83,7 @@ class PadTTS implements IMogoTTS, VoiceClient.VoiceCmdCallBack, OnTtsListener { * 初始化 */ private void initSpeech( Context context ) { + Logger.d(TAG, "initSpeech"); mogoVoiceManager = MogoVoiceManagerImpl.getInstance(); mogoVoiceManager.init( context, new OnConnStatusListener() { @Override @@ -115,7 +120,7 @@ class PadTTS implements IMogoTTS, VoiceClient.VoiceCmdCallBack, OnTtsListener { List< IMogoTTSCallback > cmdCallBacks = mCmdMap.get( cmd ); iterator = new ArrayList<>( cmdCallBacks ).iterator(); } catch ( Exception e ) { - + e.printStackTrace(); } while ( iterator != null && iterator.hasNext() ) { IMogoTTSCallback callBack = iterator.next(); @@ -192,6 +197,7 @@ class PadTTS implements IMogoTTS, VoiceClient.VoiceCmdCallBack, OnTtsListener { mVoiceClient.speakDefault( text ); } } catch ( Exception e ) { + e.printStackTrace(); } } @@ -207,6 +213,7 @@ class PadTTS implements IMogoTTS, VoiceClient.VoiceCmdCallBack, OnTtsListener { mVoiceClient.speakDefault( text ); } } catch ( Exception e ) { + e.printStackTrace(); } } @@ -241,6 +248,7 @@ class PadTTS implements IMogoTTS, VoiceClient.VoiceCmdCallBack, OnTtsListener { mVoiceClient.speakTypeText( text, preemptType ); } } catch ( Exception e ) { + e.printStackTrace(); } } @@ -320,6 +328,7 @@ class PadTTS implements IMogoTTS, VoiceClient.VoiceCmdCallBack, OnTtsListener { try { mVoiceClient.unRegisterCustomWakeupCmd( cmd ); } catch ( Exception e ) { + e.printStackTrace(); } mCacheUnWakeupCommands.remove( cmd ); } @@ -340,6 +349,7 @@ class PadTTS implements IMogoTTS, VoiceClient.VoiceCmdCallBack, OnTtsListener { try { mVoiceClient.unRegisterCustomWakeupCmd( cmd ); } catch ( Exception e ) { + e.printStackTrace(); } mCacheUnWakeupCommands.remove( cmd ); } @@ -355,6 +365,8 @@ class PadTTS implements IMogoTTS, VoiceClient.VoiceCmdCallBack, OnTtsListener { * @param status window_start_cancel 0 - 结束, 1 - 显示, 2 - 未激活调试进入 */ public static void startAssistant( Context context, int status ) { + Logger.w(TAG, "startAssistant status = %d", status); + final Intent intent = new Intent(); intent.setFlags( Intent.FLAG_INCLUDE_STOPPED_PACKAGES ); intent.setAction( "pvetec.intent.action.txz.switch" ); @@ -378,6 +390,7 @@ class PadTTS implements IMogoTTS, VoiceClient.VoiceCmdCallBack, OnTtsListener { private boolean isVoiceServiceReady( Context context ) { if ( AppUtils.isProcessRunning( context, AppUtils.getPackageUid( context, "com.zhidao.speech" ) )) { + Logger.d( TAG, "pad txz is voiceServiceReady" ); return true; } else if ( AppUtils.isProcessRunning( context, AppUtils.getPackageUid( context, "com.txznet.txz" ) ) && AppUtils.isProcessRunning( context, AppUtils.getPackageUid( context, "com.txznet.adapter" ) ) ) { @@ -398,6 +411,7 @@ class PadTTS implements IMogoTTS, VoiceClient.VoiceCmdCallBack, OnTtsListener { mogoVoiceManager.toSpeak( text, -3, this ); } } catch ( Exception e ) { + e.printStackTrace(); } } @@ -406,7 +420,7 @@ class PadTTS implements IMogoTTS, VoiceClient.VoiceCmdCallBack, OnTtsListener { mSpeakVoiceMap.remove( text ); mogoVoiceManager.shutUp( ttsId ); } catch ( Exception e ) { - + e.printStackTrace(); } } @@ -457,8 +471,15 @@ class PadTTS implements IMogoTTS, VoiceClient.VoiceCmdCallBack, OnTtsListener { mVoiceClient = new VoiceClient( mContext ); mVoiceClient.setCallBack( this ); initFlushStatus(); - initSpeech( context ); - Logger.w( TAG, "voice is ready = %s", mHasFlush ); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + // 检查是否有悬浮窗权限 + if (Settings.canDrawOverlays(context)) { + initSpeech(context); + } + } else { + initSpeech(context); + } + Logger.w(TAG, "voice is mHasFlush = %s mInitReady= %s", mHasFlush, mInitReady); } } @@ -469,6 +490,7 @@ class PadTTS implements IMogoTTS, VoiceClient.VoiceCmdCallBack, OnTtsListener { @Override public void startAIAssist( Context context, int status ) { + Logger.w(TAG, "startAIAssist status = %d", status); final Intent intent = new Intent(); intent.setFlags( Intent.FLAG_INCLUDE_STOPPED_PACKAGES ); intent.setAction( "pvetec.intent.action.txz.switch" );