diff --git a/app/src/main/java/com/idormy/sms/forwarder/MainActivity.java b/app/src/main/java/com/idormy/sms/forwarder/MainActivity.java index 94299315..d2669696 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/MainActivity.java +++ b/app/src/main/java/com/idormy/sms/forwarder/MainActivity.java @@ -31,6 +31,7 @@ import com.idormy.sms.forwarder.utils.PhoneUtils; import com.idormy.sms.forwarder.utils.SettingUtil; import com.idormy.sms.forwarder.utils.SmsUtil; import com.idormy.sms.forwarder.utils.TimeUtil; +import com.umeng.analytics.MobclickAgent; import java.lang.reflect.Method; import java.util.ArrayList; @@ -67,9 +68,13 @@ public class MainActivity extends AppCompatActivity implements RefreshListView.I NetUtil.init(this); //前台服务 - serviceIntent = new Intent(MainActivity.this, FrontService.class); - serviceIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - startService(serviceIntent); + try { + serviceIntent = new Intent(MainActivity.this, FrontService.class); + serviceIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + startService(serviceIntent); + } catch (Exception e) { + Log.e(TAG, "onCreate:", e); + } } @Override @@ -147,6 +152,8 @@ public class MainActivity extends AppCompatActivity implements RefreshListView.I @Override protected void onResume() { super.onResume(); + MobclickAgent.onResume(this); + //第一次打开,未授权无法获取SIM信息,尝试在此重新获取 if (MyApplication.SimInfoList.isEmpty()) { MyApplication.SimInfoList = PhoneUtils.getSimMultiInfo(); @@ -156,7 +163,7 @@ public class MainActivity extends AppCompatActivity implements RefreshListView.I //省电优化设置为无限制 if (Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) { if (!KeepAliveUtils.isIgnoreBatteryOptimization(this)) { - Toast.makeText(this, "请将省电优化设置为无限制(不优化),有利于《短信转发器》保活!", Toast.LENGTH_LONG).show(); + Toast.makeText(this, R.string.tips_battery_optimization, Toast.LENGTH_LONG).show(); } } @@ -164,22 +171,36 @@ public class MainActivity extends AppCompatActivity implements RefreshListView.I if (SettingUtil.getSwitchEnableAppNotify() && !CommonUtil.isNotificationListenerServiceEnabled(this)) { CommonUtil.toggleNotificationListenerService(this); SettingUtil.switchEnableAppNotify(false); - Toast.makeText(this, "请先授予《短信转发器》通知使用权,否则无法转发APP通知,已经自动关闭转发!", Toast.LENGTH_LONG).show(); + Toast.makeText(this, R.string.tips_notification_listener, Toast.LENGTH_LONG).show(); return; } - startService(serviceIntent); + + try { + if (serviceIntent != null) startService(serviceIntent); + } catch (Exception e) { + Log.e(TAG, "onResume:", e); + } } @Override protected void onDestroy() { super.onDestroy(); - startService(serviceIntent); + try { + if (serviceIntent != null) startService(serviceIntent); + } catch (Exception e) { + Log.e(TAG, "onDestroy:", e); + } } @Override protected void onPause() { super.onPause(); - startService(serviceIntent); + MobclickAgent.onPause(this); + try { + if (serviceIntent != null) startService(serviceIntent); + } catch (Exception e) { + Log.e(TAG, "onPause:", e); + } } @Override @@ -187,10 +208,10 @@ public class MainActivity extends AppCompatActivity implements RefreshListView.I super.onActivityResult(requestCode, resultCode, data); if (requestCode == CommonUtil.NOTIFICATION_REQUEST_CODE) { if (CommonUtil.isNotificationListenerServiceEnabled(this)) { - Toast.makeText(this, "通知服务已开启", Toast.LENGTH_SHORT).show(); + Toast.makeText(this, R.string.notification_listener_service_enabled, Toast.LENGTH_SHORT).show(); CommonUtil.toggleNotificationListenerService(this); } else { - Toast.makeText(this, "通知服务未开启", Toast.LENGTH_SHORT).show(); + Toast.makeText(this, R.string.notification_listener_service_disabled, Toast.LENGTH_SHORT).show(); } } } diff --git a/app/src/main/java/com/idormy/sms/forwarder/MyApplication.java b/app/src/main/java/com/idormy/sms/forwarder/MyApplication.java index 72b05bee..96b4558c 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/MyApplication.java +++ b/app/src/main/java/com/idormy/sms/forwarder/MyApplication.java @@ -75,27 +75,31 @@ public class MyApplication extends Application { public void onCreate() { Log.d(TAG, "onCreate"); super.onCreate(); - //初始化组件化基础库, 所有友盟业务SDK都必须调用此初始化接口。 - //建议在宿主App的Application.onCreate函数中调用基础组件库初始化函数。 - UMConfigure.init(this, "60254fc7425ec25f10f4293e", getChannelName(this), UMConfigure.DEVICE_TYPE_PHONE, ""); - // 选用LEGACY_AUTO页面采集模式 - MobclickAgent.setPageCollectionMode(MobclickAgent.PageMode.LEGACY_MANUAL); - //pro close log - UMConfigure.setLogEnabled(true); - Intent intent = new Intent(this, FrontService.class); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - startForegroundService(intent); - } else { - startService(intent); - } - SendHistory.init(this); - SettingUtil.init(this); + try { + //初始化组件化基础库, 所有友盟业务SDK都必须调用此初始化接口。 + //建议在宿主App的Application.onCreate函数中调用基础组件库初始化函数。 + UMConfigure.init(this, "60254fc7425ec25f10f4293e", getChannelName(this), UMConfigure.DEVICE_TYPE_PHONE, ""); + // 选用LEGACY_AUTO页面采集模式 + MobclickAgent.setPageCollectionMode(MobclickAgent.PageMode.LEGACY_MANUAL); + //pro close log + UMConfigure.setLogEnabled(true); - EmailKit.initialize(this); + Intent intent = new Intent(this, FrontService.class); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + startForegroundService(intent); + } else { + startService(intent); + } + SendHistory.init(this); + SettingUtil.init(this); - SharedPreferences sp = MyApplication.this.getSharedPreferences(Define.SP_CONFIG, Context.MODE_PRIVATE); - showHelpTip = sp.getBoolean(Define.SP_CONFIG_SWITCH_HELP_TIP, true); + EmailKit.initialize(this); + SharedPreferences sp = MyApplication.this.getSharedPreferences(Define.SP_CONFIG, Context.MODE_PRIVATE); + showHelpTip = sp.getBoolean(Define.SP_CONFIG_SWITCH_HELP_TIP, true); + } catch (Exception e) { + Log.e(TAG, "onCreate:", e); + } } } diff --git a/app/src/main/java/com/idormy/sms/forwarder/SettingActivity.java b/app/src/main/java/com/idormy/sms/forwarder/SettingActivity.java index 8bf22e96..7a0e57f0 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/SettingActivity.java +++ b/app/src/main/java/com/idormy/sms/forwarder/SettingActivity.java @@ -361,7 +361,7 @@ public class SettingActivity extends AppCompatActivity { if (!CommonUtil.isNotificationListenerServiceEnabled(this)) { CommonUtil.openNotificationAccess(this); } else { - Toast.makeText(this, "通知服务已开启", Toast.LENGTH_SHORT).show(); + Toast.makeText(this, R.string.notification_listener_service_enabled, Toast.LENGTH_SHORT).show(); CommonUtil.toggleNotificationListenerService(this); } } @@ -371,11 +371,16 @@ public class SettingActivity extends AppCompatActivity { super.onActivityResult(requestCode, resultCode, data); if (requestCode == CommonUtil.NOTIFICATION_REQUEST_CODE) { if (CommonUtil.isNotificationListenerServiceEnabled(this)) { - Toast.makeText(this, "通知服务已开启", Toast.LENGTH_SHORT).show(); + Toast.makeText(this, R.string.notification_listener_service_enabled, Toast.LENGTH_SHORT).show(); CommonUtil.toggleNotificationListenerService(this); + SettingUtil.switchEnableAppNotify(true); } else { - Toast.makeText(this, "通知服务未开启", Toast.LENGTH_SHORT).show(); + Toast.makeText(this, R.string.notification_listener_service_disabled, Toast.LENGTH_SHORT).show(); + SettingUtil.switchEnableAppNotify(false); } + + @SuppressLint("UseSwitchCompatOrMaterialCode") Switch switch_enable_app_notify = findViewById(R.id.switch_enable_app_notify); + switch_enable_app_notify.setChecked(SettingUtil.getSwitchEnableAppNotify()); } } diff --git a/app/src/main/java/com/idormy/sms/forwarder/adapter/AppAdapter.java b/app/src/main/java/com/idormy/sms/forwarder/adapter/AppAdapter.java index 574353a8..5bc17325 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/adapter/AppAdapter.java +++ b/app/src/main/java/com/idormy/sms/forwarder/adapter/AppAdapter.java @@ -1,5 +1,6 @@ package com.idormy.sms.forwarder.adapter; +import android.annotation.SuppressLint; import android.content.Context; import android.view.LayoutInflater; import android.view.View; @@ -40,6 +41,7 @@ public class AppAdapter extends ArrayAdapter { return 0; } + @SuppressLint("SetTextI18n") @Override public View getView(int position, View convertView, ViewGroup parent) { AppInfo appInfo = getItem(position); //获取当前项的TLog实例 diff --git a/app/src/main/java/com/idormy/sms/forwarder/model/AppInfo.java b/app/src/main/java/com/idormy/sms/forwarder/model/AppInfo.java index 190a7c7a..0c4ed732 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/model/AppInfo.java +++ b/app/src/main/java/com/idormy/sms/forwarder/model/AppInfo.java @@ -3,6 +3,8 @@ package com.idormy.sms.forwarder.model; import android.content.Intent; import android.graphics.drawable.Drawable; +import androidx.annotation.NonNull; + import lombok.Data; @Data @@ -34,6 +36,7 @@ public class AppInfo { this.verCode = verCode; } + @NonNull @Override public String toString() { return "AppInfo{" + diff --git a/app/src/main/java/com/idormy/sms/forwarder/service/NotifyService.java b/app/src/main/java/com/idormy/sms/forwarder/service/NotifyService.java index 9bd65e23..1866db15 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/service/NotifyService.java +++ b/app/src/main/java/com/idormy/sms/forwarder/service/NotifyService.java @@ -41,38 +41,47 @@ public class NotifyService extends NotificationListenerService { //自身通知跳过 if ("com.idormy.sms.forwarder".equals(packageName)) return; - //通知标题 - String title = sbn.getNotification().extras.get("android.title").toString(); - //通知内容 - String text = sbn.getNotification().extras.get("android.text").toString(); - if (text.isEmpty() && sbn.getNotification().tickerText != null) { - text = sbn.getNotification().tickerText.toString(); + try { + //通知标题 + String title = ""; + if (sbn.getNotification().extras.get("android.title") != null) { + title = sbn.getNotification().extras.get("android.title").toString(); + } + //通知内容 + String text = ""; + if (sbn.getNotification().extras.get("android.text") != null) { + text = sbn.getNotification().extras.get("android.text").toString(); + } + if (text.isEmpty() && sbn.getNotification().tickerText != null) { + text = sbn.getNotification().tickerText.toString(); + } + //不处理空消息(标题跟内容都为空) + if (title.isEmpty() && text.isEmpty()) return; + + //通知时间 + String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINESE).format(new Date(sbn.getPostTime())); + Log.d(TAG, String.format( + Locale.getDefault(), + "onNotificationPosted:\n应用包名:%s\n消息标题:%s\n消息内容:%s\n消息时间:%s\n", + packageName, title, text, time) + ); + + //重复通知不再处理 + String prevHash = SettingUtil.getPrevNoticeHash(packageName); + String currHash = CommonUtil.MD5(packageName + title + text + time); + Log.d(TAG, "prevHash=" + prevHash + " currHash=" + currHash); + if (prevHash != null && prevHash.equals(currHash)) { + Log.w(TAG, "重复通知不再处理"); + return; + } + SettingUtil.setPrevNoticeHash(packageName, currHash); + + SmsVo smsVo = new SmsVo(packageName, text, new Date(), title); + Log.d(TAG, "send_msg" + smsVo.toString()); + SendUtil.send_msg(this, smsVo, 1, "app"); + } catch (Exception e) { + Log.e(TAG, "onNotificationPosted:", e); } - //不处理空消息(标题跟内容都为空) - if (title.isEmpty() && text.isEmpty()) return; - - //通知时间 - String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINESE).format(new Date(sbn.getPostTime())); - Log.d(TAG, String.format( - Locale.getDefault(), - "onNotificationPosted:\n应用包名:%s\n消息标题:%s\n消息内容:%s\n消息时间:%s\n", - packageName, title, text, time) - ); - - //重复通知不再处理 - String prevHash = SettingUtil.getPrevNoticeHash(packageName); - String currHash = CommonUtil.MD5(packageName + title + text + time); - Log.d(TAG, "prevHash=" + prevHash + " currHash=" + currHash); - if (prevHash != null && prevHash.equals(currHash)) { - Log.w(TAG, "重复通知不再处理"); - return; - } - SettingUtil.setPrevNoticeHash(packageName, currHash); - - SmsVo smsVo = new SmsVo(packageName, text, new Date(), title); - Log.d(TAG, "send_msg" + smsVo.toString()); - SendUtil.send_msg(this, smsVo, 1, "app"); - //NotifyHelper.getInstance().onReceive(sbn); } diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 40275c9a..bb06ead4 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -74,7 +74,7 @@ android:background="@color/colorPrimary" android:onClick="cleanLog" android:text="@string/bt_refresh_log" - tools:ignore="ButtonStyle,NestedWeights" /> + tools:ignore="ButtonStyle,NestedWeights,UsingOnClickInXml" />