更新类库版本
This commit is contained in:
		| @@ -18,18 +18,18 @@ def genVersionName(def versionName){ | ||||
| } | ||||
|  | ||||
| android { | ||||
|     compileSdkVersion 30 | ||||
|     buildToolsVersion "30.0.3" | ||||
|     compileSdkVersion 32 | ||||
|     buildToolsVersion "32.0.0" | ||||
|  | ||||
|     defaultConfig { | ||||
|         applicationId "cc.winboll.studio.contacts" | ||||
|         minSdkVersion 26 | ||||
|         minSdkVersion 24 | ||||
|         targetSdkVersion 29 | ||||
|         versionCode 1 | ||||
|         // versionName 更新后需要手动设置  | ||||
|         // 项目模块目录的 build.gradle 文件的 stageCount=0 | ||||
|         // Gradle编译环境下合起来的 versionName 就是 "${versionName}.0" | ||||
|         versionName "1.0"  | ||||
|         versionName "15.2"  | ||||
|         if(true) { | ||||
|             versionName = genVersionName("${versionName}") | ||||
|         } | ||||
| @@ -75,7 +75,7 @@ dependencies { | ||||
|     implementation 'androidx.fragment:fragment:1.1.0' | ||||
|     implementation 'com.google.android.material:material:1.4.0' | ||||
|      | ||||
|     implementation 'cc.winboll.studio:libappbase:2.1.5' | ||||
|     implementation 'cc.winboll.studio:libapputils:9.4.4' | ||||
|     implementation 'cc.winboll.studio:libaes:7.6.12' | ||||
|     implementation 'cc.winboll.studio:libappbase:15.2.0' | ||||
|     implementation 'cc.winboll.studio:libapputils:15.2.0' | ||||
|     implementation 'cc.winboll.studio:libaes:15.2.0' | ||||
| } | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| #Created by .winboll/winboll_app_build.gradle | ||||
| #Wed Mar 19 11:09:14 HKT 2025 | ||||
| #Sat Mar 29 01:09:07 GMT 2025 | ||||
| stageCount=22 | ||||
| libraryProject= | ||||
| baseVersion=1.0 | ||||
| baseVersion=15.2 | ||||
| publishVersion=1.0.21 | ||||
| buildCount=0 | ||||
| buildCount=5 | ||||
| baseBetaVersion=1.0.22 | ||||
|   | ||||
| @@ -33,6 +33,9 @@ | ||||
|     <!-- 读取通话记录 --> | ||||
|     <uses-permission android:name="android.permission.READ_CALL_LOG"/> | ||||
|  | ||||
|     <!-- 录音 --> | ||||
|     <uses-permission android:name="android.permission.RECORD_AUDIO"/> | ||||
|  | ||||
|     <application | ||||
|         android:name=".App" | ||||
|         android:allowBackup="true" | ||||
|   | ||||
| @@ -7,7 +7,7 @@ package cc.winboll.studio.contacts; | ||||
|  */ | ||||
| import cc.winboll.studio.libappbase.GlobalApplication; | ||||
| import cc.winboll.studio.libappbase.LogUtils; | ||||
| import cc.winboll.studio.libapputils.app.WinBollActivityManager; | ||||
| import cc.winboll.studio.libappbase.winboll.WinBollActivityManager; | ||||
| import com.hjq.toast.ToastUtils; | ||||
|  | ||||
| public class App extends GlobalApplication { | ||||
| @@ -18,7 +18,7 @@ public class App extends GlobalApplication { | ||||
|     public void onCreate() { | ||||
|         // 必须在调用基类前设置应用调试标志, | ||||
|         // 这样可以预先设置日志与数据的存储根目录。 | ||||
|         setIsDebuging(this, BuildConfig.DEBUG); | ||||
|         setIsDebuging(BuildConfig.DEBUG); | ||||
|         super.onCreate(); | ||||
|         // 设置 WinBoll 应用 UI 类型 | ||||
|         WinBollActivityManager.getInstance(this).setWinBollUI_TYPE(WinBollActivityManager.WinBollUI_TYPE.Aplication); | ||||
|   | ||||
| @@ -32,10 +32,10 @@ import cc.winboll.studio.contacts.fragments.CallLogFragment; | ||||
| import cc.winboll.studio.contacts.fragments.ContactsFragment; | ||||
| import cc.winboll.studio.contacts.fragments.LogFragment; | ||||
| import cc.winboll.studio.contacts.services.MainService; | ||||
| import cc.winboll.studio.libaes.winboll.APPInfo; | ||||
| import cc.winboll.studio.libappbase.LogUtils; | ||||
| import cc.winboll.studio.libappbase.LogView; | ||||
| import cc.winboll.studio.libapputils.app.IWinBollActivity; | ||||
| import cc.winboll.studio.libapputils.bean.APPInfo; | ||||
| import cc.winboll.studio.libappbase.winboll.IWinBollActivity; | ||||
| import com.google.android.material.tabs.TabLayout; | ||||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
| @@ -70,12 +70,12 @@ final public class MainActivity extends AppCompatActivity implements IWinBollAct | ||||
|     private static final int DIALER_REQUEST_CODE = 1; | ||||
|  | ||||
|     @Override | ||||
|     public AppCompatActivity getActivity() { | ||||
|     public Activity getActivity() { | ||||
|         return this; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public APPInfo getAppInfo() { | ||||
| //    @Override | ||||
| //    public APPInfo getAppInfo() { | ||||
| //        String szBranchName = "contacts"; | ||||
| // | ||||
| //        APPInfo appInfo = AboutActivityFactory.buildDefaultAPPInfo(); | ||||
| @@ -90,8 +90,8 @@ final public class MainActivity extends AppCompatActivity implements IWinBollAct | ||||
| //        appInfo.setAppAPKName("Contacts"); | ||||
| //        appInfo.setAppAPKFolderName("Contacts"); | ||||
| //        return appInfo; | ||||
|         return null; | ||||
|     } | ||||
| //        return null; | ||||
| //    } | ||||
|  | ||||
|     @Override | ||||
|     protected void onCreate(Bundle savedInstanceState) { | ||||
| @@ -105,10 +105,10 @@ final public class MainActivity extends AppCompatActivity implements IWinBollAct | ||||
|         // 初始化工具栏 | ||||
|         mToolbar = findViewById(R.id.activitymainToolbar1); | ||||
|         setSupportActionBar(mToolbar); | ||||
|         if (isEnableDisplayHomeAsUp()) { | ||||
|             // 显示后退按钮 | ||||
|             getSupportActionBar().setDisplayHomeAsUpEnabled(true); | ||||
|         } | ||||
| //        if (isEnableDisplayHomeAsUp()) { | ||||
| //            // 显示后退按钮 | ||||
| //            getSupportActionBar().setDisplayHomeAsUpEnabled(true); | ||||
| //        } | ||||
|         getSupportActionBar().setSubtitle(getTag()); | ||||
|          | ||||
|         tabLayout = findViewById(R.id.tabLayout); | ||||
| @@ -374,21 +374,6 @@ final public class MainActivity extends AppCompatActivity implements IWinBollAct | ||||
|         return TAG; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public Toolbar initToolBar() { | ||||
|         return findViewById(R.id.activitymainToolbar1); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean isAddWinBollToolBar() { | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean isEnableDisplayHomeAsUp() { | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
| //    @Override | ||||
| //    public void onBackPressed() { | ||||
| //        exit(); | ||||
|   | ||||
| @@ -34,9 +34,9 @@ import cc.winboll.studio.contacts.bobulltoon.TomCat; | ||||
| import cc.winboll.studio.contacts.dun.Rules; | ||||
| import cc.winboll.studio.contacts.services.MainService; | ||||
| import cc.winboll.studio.contacts.views.DuInfoTextView; | ||||
| import cc.winboll.studio.libaes.winboll.APPInfo; | ||||
| import cc.winboll.studio.libappbase.LogUtils; | ||||
| import cc.winboll.studio.libapputils.app.IWinBollActivity; | ||||
| import cc.winboll.studio.libapputils.bean.APPInfo; | ||||
| import cc.winboll.studio.libappbase.winboll.IWinBollActivity; | ||||
| import com.hjq.toast.ToastUtils; | ||||
| import java.lang.reflect.Field; | ||||
| import java.util.List; | ||||
| @@ -67,11 +67,6 @@ public class SettingsActivity extends AppCompatActivity implements IWinBollActiv | ||||
|     private PhoneConnectRuleAdapter adapter; | ||||
|     private List<PhoneConnectRuleModel> ruleList; | ||||
|  | ||||
|     @Override | ||||
|     public APPInfo getAppInfo() { | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public AppCompatActivity getActivity() { | ||||
|         return this; | ||||
| @@ -82,21 +77,6 @@ public class SettingsActivity extends AppCompatActivity implements IWinBollActiv | ||||
|         return TAG; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public Toolbar initToolBar() { | ||||
|         return findViewById(R.id.activitymainToolbar1); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean isAddWinBollToolBar() { | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean isEnableDisplayHomeAsUp() { | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     protected void onCreate(Bundle savedInstanceState) { | ||||
|         super.onCreate(savedInstanceState); | ||||
| @@ -105,10 +85,8 @@ public class SettingsActivity extends AppCompatActivity implements IWinBollActiv | ||||
|         // 初始化工具栏 | ||||
|         mToolbar = findViewById(R.id.activitymainToolbar1); | ||||
|         setSupportActionBar(mToolbar); | ||||
|         if (isEnableDisplayHomeAsUp()) { | ||||
|             // 显示后退按钮 | ||||
|             getSupportActionBar().setDisplayHomeAsUpEnabled(true); | ||||
|         } | ||||
|         // 显示后退按钮 | ||||
|         getSupportActionBar().setDisplayHomeAsUpEnabled(true); | ||||
|         getSupportActionBar().setSubtitle(getTag()); | ||||
|  | ||||
|         mswMainService = findViewById(R.id.sw_mainservice); | ||||
| @@ -232,7 +210,7 @@ public class SettingsActivity extends AppCompatActivity implements IWinBollActiv | ||||
|         Intent intent = new Intent(this, UnitTestActivity.class); | ||||
|         startActivity(intent); | ||||
|     } | ||||
|      | ||||
|  | ||||
|     public void onAddNewConnectionRule(View view) { | ||||
|         Rules.getInstance(this).getPhoneBlacRuleBeanList().add(new PhoneConnectRuleModel()); | ||||
|         Rules.getInstance(this).saveRules(); | ||||
| @@ -267,8 +245,8 @@ public class SettingsActivity extends AppCompatActivity implements IWinBollActiv | ||||
|                 } | ||||
|             }).start(); | ||||
|     } | ||||
|      | ||||
|      | ||||
|  | ||||
|  | ||||
|  | ||||
|     public void onSearchBoBullToonPhone(View view) { | ||||
|         TomCat tomCat = TomCat.getInstance(this); | ||||
|   | ||||
| @@ -19,14 +19,11 @@ import androidx.recyclerview.widget.RecyclerView; | ||||
| import cc.winboll.studio.contacts.R; | ||||
| import cc.winboll.studio.contacts.beans.PhoneConnectRuleModel; | ||||
| import cc.winboll.studio.contacts.dun.Rules; | ||||
| import cc.winboll.studio.contacts.views.LeftScrollView; | ||||
| import cc.winboll.studio.libappbase.dialogs.YesNoAlertDialog; | ||||
| import com.hjq.toast.ToastUtils; | ||||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
| import android.widget.LinearLayout; | ||||
| import android.view.MotionEvent; | ||||
| import android.widget.HorizontalScrollView; | ||||
| import cc.winboll.studio.contacts.views.LeftScrollView; | ||||
| import com.hjq.toast.ToastUtils; | ||||
| import cc.winboll.studio.libapputils.view.YesNoAlertDialog; | ||||
|  | ||||
| public class PhoneConnectRuleAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { | ||||
|  | ||||
|   | ||||
| @@ -7,26 +7,52 @@ package cc.winboll.studio.contacts.phonecallui; | ||||
|  * @see PhoneCallActivity | ||||
|  * @see android.telecom.InCallService | ||||
|  */ | ||||
| import android.content.ContentResolver; | ||||
| import android.database.Cursor; | ||||
| import android.media.AudioManager; | ||||
| import android.media.MediaRecorder; | ||||
| import android.net.Uri; | ||||
| import android.os.Build; | ||||
| import android.provider.CallLog; | ||||
| import android.telecom.Call; | ||||
| import android.telecom.InCallService; | ||||
| import android.telephony.TelephonyManager; | ||||
| import androidx.annotation.RequiresApi; | ||||
| import cc.winboll.studio.contacts.ActivityStack; | ||||
| import cc.winboll.studio.contacts.beans.RingTongBean; | ||||
| import cc.winboll.studio.contacts.dun.Rules; | ||||
| import cc.winboll.studio.libappbase.LogUtils; | ||||
| import java.io.File; | ||||
| import java.io.IOException; | ||||
|  | ||||
| @RequiresApi(api = Build.VERSION_CODES.M) | ||||
| public class PhoneCallService extends InCallService { | ||||
|  | ||||
|     public static final String TAG = "PhoneCallService"; | ||||
|  | ||||
|     MediaRecorder mediaRecorder; | ||||
|  | ||||
|     private final Call.Callback callback = new Call.Callback() { | ||||
|         @Override | ||||
|         public void onStateChanged(Call call, int state) { | ||||
|             super.onStateChanged(call, state); | ||||
|             switch (state) { | ||||
|                 case TelephonyManager.CALL_STATE_OFFHOOK: | ||||
|                     { | ||||
|                         long callId = getCurrentCallId(); | ||||
|                         if (callId != -1) { | ||||
|                             // 在这里可以对获取到的通话记录ID进行处理 | ||||
|                             //System.out.println("当前通话记录ID: " + callId); | ||||
|  | ||||
|                             // 电话接通,开始录音 | ||||
|                             startRecording(callId); | ||||
|                         } | ||||
|                         break; | ||||
|                     } | ||||
|                 case TelephonyManager.CALL_STATE_IDLE: | ||||
|                     // 电话挂断,停止录音 | ||||
|                     stopRecording(); | ||||
|                     break; | ||||
|                 case Call.STATE_ACTIVE: { | ||||
|                         break; | ||||
|                     } | ||||
| @@ -127,4 +153,56 @@ public class PhoneCallService extends InCallService { | ||||
|         CALL_IN, | ||||
|         CALL_OUT, | ||||
|     } | ||||
|  | ||||
|  | ||||
|     private void startRecording(long callId) { | ||||
|         LogUtils.d(TAG, "startRecording(...)"); | ||||
|         mediaRecorder = new MediaRecorder(); | ||||
|         mediaRecorder.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL); | ||||
|         mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); | ||||
|         mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); | ||||
|         mediaRecorder.setOutputFile(getOutputFilePath(callId)); | ||||
|         try { | ||||
|             mediaRecorder.prepare(); | ||||
|             mediaRecorder.start(); | ||||
|         } catch (IOException e) { | ||||
|             LogUtils.d(TAG, e, Thread.currentThread().getStackTrace()); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private String getOutputFilePath(long callId) { | ||||
|         LogUtils.d(TAG, "getOutputFilePath(...)"); | ||||
|         // 设置录音文件的保存路径 | ||||
|         File file = new File(getExternalFilesDir(TAG), String.format("call_%d.mp4", callId)); | ||||
|         return file.getAbsolutePath(); | ||||
|     } | ||||
|  | ||||
|     private void stopRecording() { | ||||
|         LogUtils.d(TAG, "stopRecording()"); | ||||
|         if (mediaRecorder != null) { | ||||
|             mediaRecorder.stop(); | ||||
|             mediaRecorder.release(); | ||||
|             mediaRecorder = null; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private long getCurrentCallId() { | ||||
|         LogUtils.d(TAG, "getCurrentCallId()"); | ||||
|         ContentResolver contentResolver = getApplicationContext().getContentResolver(); | ||||
|         Uri callLogUri = Uri.parse("content://call_log/calls"); | ||||
|         String[] projection = {"_id", "number", "call_type", "date"}; | ||||
|         String selection = "call_type = " + CallLog.Calls.OUTGOING_TYPE + " OR call_type = " + CallLog.Calls.INCOMING_TYPE; | ||||
|         String sortOrder = "date DESC"; | ||||
|  | ||||
|         try { | ||||
|             Cursor cursor = contentResolver.query(callLogUri, projection, selection, null, sortOrder); | ||||
|             if (cursor != null && cursor.moveToFirst()) { | ||||
|                 return cursor.getLong(cursor.getColumnIndex("_id")); | ||||
|             } | ||||
|         } catch (Exception e) { | ||||
|             LogUtils.d(TAG, e, Thread.currentThread().getStackTrace()); | ||||
|         } | ||||
|  | ||||
|         return -1; | ||||
|     } | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 ZhanGSKen
					ZhanGSKen