@@ -4,6 +4,7 @@ import android.Manifest;
import android.content.ActivityNotFoundException ;
import android.content.BroadcastReceiver ;
import android.content.ComponentName ;
import android.content.ContentResolver ;
import android.content.Context ;
import android.content.Intent ;
import android.content.IntentFilter ;
@@ -14,11 +15,15 @@ import android.database.Cursor;
import android.hardware.camera2.CameraAccessException ;
import android.hardware.camera2.CameraCharacteristics ;
import android.hardware.camera2.CameraManager ;
import android.net.Uri ;
import android.os.Build ;
import android.os.Bundle ;
import android.provider.CallLog ;
import android.provider.ContactsContract ;
import android.provider.Settings ;
import android.speech.tts.TextToSpeech ;
import android.telephony.PhoneStateListener ;
import android.telephony.TelephonyManager ;
import android.text.TextUtils ;
import android.util.Log ;
import android.view.KeyEvent ;
@@ -81,10 +86,12 @@ import java.text.SimpleDateFormat;
import java.util.ArrayList ;
import java.util.Date ;
import java.util.List ;
import java.util.Locale ;
import static com.arialyy.aria.core.inf.IEntity.STATE_RUNNING ;
public class MainActivity extends BaseMvvmActivity < MainViewModel , ActivityMainBinding > implements NetworkUtils . OnNetworkStatusChangedListener , NotificationService . NotificationListener {
public class MainActivity extends BaseMvvmActivity < MainViewModel , ActivityMainBinding > implements NetworkUtils . OnNetworkStatusChangedListener ,
NotificationService . NotificationListener , TextToSpeech . OnInitListener {
private static final String TAG = " MainActivity " ;
@@ -107,8 +114,10 @@ public class MainActivity extends BaseMvvmActivity<MainViewModel, ActivityMainBi
private int appListIndex = 0 ;
private int defaultCurrent = 0 ;
private CameraManager c ameraManager;
private CameraManager mC ameraManager;
private boolean flashing = false ;
private TelephonyManager mTelephonyManager ;
private PhoneStateListener mPhoneStateListener ;
// private DockAppAdapter mDockAppAdapter;
private DockAppGridAdapter mDockAppGridAdapter ;
@@ -178,7 +187,30 @@ public class MainActivity extends BaseMvvmActivity<MainViewModel, ActivityMainBi
// Toaster.show("请授予\"" + getString(R.string.app_name) + "\"使用通知权");
// gotoNotificationAccessSetting(MainActivity.this);
// }
c ameraManager = ( CameraManager ) getSystemService ( Context . CAMERA_SERVICE ) ;
mC ameraManager = ( CameraManager ) getSystemService ( Context . CAMERA_SERVICE ) ;
mTelephonyManager = ( TelephonyManager ) getSystemService ( Context . TELEPHONY_SERVICE ) ;
mPhoneStateListener = new PhoneStateListener ( ) {
@Override
public void onCallStateChanged ( int state , String phoneNumber ) {
super . onCallStateChanged ( state , phoneNumber ) ;
Log . e ( TAG , " onCallStateChanged: state = " + state ) ;
switch ( state ) {
case TelephonyManager . CALL_STATE_IDLE :
Log . e ( TAG , " onCallStateChanged: 无状态 " ) ;
break ;
case TelephonyManager . CALL_STATE_OFFHOOK :
Log . e ( TAG , " onCallStateChanged: 通话 " ) ;
break ;
case TelephonyManager . CALL_STATE_RINGING :
Log . e ( TAG , " onCallStateChanged: 响铃 " ) ;
getLatestIncomingCallNumber ( ) ;
break ;
default :
}
}
} ;
mTelephonyManager . listen ( mPhoneStateListener , PhoneStateListener . LISTEN_CALL_STATE ) ;
mFragmentManager = getSupportFragmentManager ( ) ;
mFragmentTransaction = mFragmentManager . beginTransaction ( ) ;
@@ -284,6 +316,60 @@ public class MainActivity extends BaseMvvmActivity<MainViewModel, ActivityMainBi
decorView . setSystemUiVisibility ( uiOptions ) ;
}
private String getLatestIncomingCallNumber ( ) {
String phoneNumber = " " ;
Cursor cursor = getContentResolver ( ) . query (
CallLog . Calls . CONTENT_URI , new String [ ] { CallLog . Calls . NUMBER } ,
CallLog . Calls . TYPE + " = " + CallLog . Calls . INCOMING_TYPE ,
null ,
CallLog . Calls . DATE + " DESC "
) ;
if ( cursor ! = null ) {
try {
if ( cursor . moveToFirst ( ) ) {
phoneNumber = cursor . getString ( cursor . getColumnIndex ( CallLog . Calls . NUMBER ) ) ;
}
} catch ( Exception e ) {
Log . e ( TAG , " getLatestIncomingCallNumber: " + e . getMessage ( ) ) ;
} finally {
cursor . close ( ) ;
}
} else {
Log . e ( TAG , " getLatestIncomingCallNumber: cursor is null " ) ;
}
Log . e ( TAG , " getLatestIncomingCallNumber: " + phoneNumber ) ;
return phoneNumber ;
}
public String getContactName ( String number ) {
if ( TextUtils . isEmpty ( number ) ) {
return null ;
}
ContentResolver resolver = getContentResolver ( ) ;
Uri lookupUri ;
String [ ] projection = new String [ ] { ContactsContract . PhoneLookup . _ID , ContactsContract . PhoneLookup . DISPLAY_NAME } ;
Cursor cursor = null ;
try {
lookupUri = Uri . withAppendedPath ( ContactsContract . PhoneLookup . CONTENT_FILTER_URI , Uri . encode ( number ) ) ;
cursor = resolver . query ( lookupUri , projection , null , null , null ) ;
} catch ( Exception ex ) {
ex . printStackTrace ( ) ;
try {
lookupUri = Uri . withAppendedPath ( android . provider . Contacts . Phones . CONTENT_FILTER_URL ,
Uri . encode ( number ) ) ;
cursor = resolver . query ( lookupUri , projection , null , null , null ) ;
} catch ( Exception e ) {
e . printStackTrace ( ) ;
}
}
String ret = " " ;
if ( cursor ! = null & & cursor . getCount ( ) > 0 & & cursor . moveToFirst ( ) ) {
ret = cursor . getString ( 1 ) ;
cursor . close ( ) ;
}
return ret ;
}
private void updateIconBg ( ) {
int size0 = NotificationService . getNotificationLength ( " com.android.dialer " ) ;
if ( size0 = = 0 ) {
@@ -900,6 +986,7 @@ public class MainActivity extends BaseMvvmActivity<MainViewModel, ActivityMainBi
registmUpdateAddressReceiver ( ) ;
registerTimeReceiver ( ) ;
registerMissCallReceiver ( ) ;
registerPhoneStateReceiver ( ) ;
}
private void unregisterAllReceiver ( ) {
@@ -921,6 +1008,9 @@ public class MainActivity extends BaseMvvmActivity<MainViewModel, ActivityMainBi
if ( mMissCallReceiver ! = null ) {
unregisterReceiver ( mMissCallReceiver ) ;
}
if ( mPhoneStateReceiver ! = null ) {
unregisterReceiver ( mPhoneStateReceiver ) ;
}
}
private void registNewAppReceiver ( ) {
@@ -1071,6 +1161,70 @@ public class MainActivity extends BaseMvvmActivity<MainViewModel, ActivityMainBi
}
}
private PhoneStateReceiver mPhoneStateReceiver ;
private void registerPhoneStateReceiver ( ) {
if ( mPhoneStateReceiver = = null ) {
mPhoneStateReceiver = new PhoneStateReceiver ( ) ;
}
IntentFilter filter = new IntentFilter ( ) ;
filter . addAction ( " android.intent.action.PHONE_STATE " ) ;
registerReceiver ( mPhoneStateReceiver , filter ) ;
}
private class PhoneStateReceiver extends BroadcastReceiver {
@Override
public void onReceive ( Context context , Intent intent ) {
String action = intent . getAction ( ) ;
if ( TextUtils . equals ( action , " android.intent.action.PHONE_STATE " ) ) {
String state = intent . getStringExtra ( " state " ) ;
String number = intent . getStringExtra ( " incoming_number " ) ;
Log . e ( TAG , " PhoneStateReceiver: state = " + state + " , number = " + number ) ;
if ( TelephonyManager . EXTRA_STATE_RINGING . equalsIgnoreCase ( state ) ) {
boolean voiceBroadcast = mMMKV . decodeBool ( CommonConfig . VOICE_BROADCAST , false ) ;
Log . e ( TAG , " onReceive: voiceBroadcast = " + voiceBroadcast ) ;
if ( voiceBroadcast ) {
mTextToSpeech = new TextToSpeech ( MainActivity . this , MainActivity . this ) ;
if ( TextUtils . isEmpty ( number ) ) {
mPhoneInfo = " 未知号码来电 " ;
} else {
mPhoneInfo = " 来自 " + getContactName ( number ) + number + " 的电话 " ;
}
}
}
}
}
}
private TextToSpeech mTextToSpeech ;
private String mPhoneInfo ;
@Override
public void onInit ( int status ) {
//初始化成功
if ( status = = TextToSpeech . SUCCESS ) {
Log . e ( TAG , " init success " ) ;
//设置语言
int result = mTextToSpeech . setLanguage ( Locale . CHINA ) ;
if ( result ! = TextToSpeech . LANG_COUNTRY_AVAILABLE
& & result ! = TextToSpeech . LANG_AVAILABLE ) {
} else {
//设置音调
mTextToSpeech . setPitch ( 1 . 0f ) ;
//设置语速, 1.0为正常语速
mTextToSpeech . setSpeechRate ( 1 . 0f ) ;
//播放
StringBuilder stringBuilder = new StringBuilder ( ) ;
stringBuilder . append ( mPhoneInfo ) ;
mTextToSpeech . speak ( stringBuilder . toString ( ) , TextToSpeech . QUEUE_ADD , null ) ;
}
} else {
Log . e ( TAG , " init fail " ) ;
Toaster . showLong ( " TTS初始化失败 " ) ;
}
}
private void setTime ( ) {
LiveEventBus
. get ( " time " )
@@ -1138,8 +1292,8 @@ public class MainActivity extends BaseMvvmActivity<MainViewModel, ActivityMainBi
public void openFlash ( View v ) {
if ( flashing ) {
try {
String CameraId = c ameraManager. getCameraIdList ( ) [ 0 ] ;
c ameraManager. setTorchMode ( CameraId , false ) ;
String CameraId = mC ameraManager. getCameraIdList ( ) [ 0 ] ;
mC ameraManager. setTorchMode ( CameraId , false ) ;
} catch ( CameraAccessException e ) {
e . printStackTrace ( ) ;
}
@@ -1148,8 +1302,8 @@ public class MainActivity extends BaseMvvmActivity<MainViewModel, ActivityMainBi
// cl_flashlight.setBackground(mContext.getDrawable(R.drawable.control_background_item_dis));
} else {
try {
String CameraId = c ameraManager. getCameraIdList ( ) [ 0 ] ;
c ameraManager. setTorchMode ( CameraId , true ) ;
String CameraId = mC ameraManager. getCameraIdList ( ) [ 0 ] ;
mC ameraManager. setTorchMode ( CameraId , true ) ;
} catch ( CameraAccessException e ) {
e . printStackTrace ( ) ;
}