更新类库版本

This commit is contained in:
ZhanGSKen 2025-03-29 09:13:14 +08:00
parent 473dd627fe
commit 1a571684ca
8 changed files with 114 additions and 73 deletions

View File

@ -18,18 +18,18 @@ def genVersionName(def versionName){
} }
android { android {
compileSdkVersion 30 compileSdkVersion 32
buildToolsVersion "30.0.3" buildToolsVersion "32.0.0"
defaultConfig { defaultConfig {
applicationId "cc.winboll.studio.contacts" applicationId "cc.winboll.studio.contacts"
minSdkVersion 26 minSdkVersion 24
targetSdkVersion 29 targetSdkVersion 29
versionCode 1 versionCode 1
// versionName // versionName
// build.gradle stageCount=0 // build.gradle stageCount=0
// Gradle编译环境下合起来的 versionName "${versionName}.0" // Gradle编译环境下合起来的 versionName "${versionName}.0"
versionName "1.0" versionName "15.2"
if(true) { if(true) {
versionName = genVersionName("${versionName}") versionName = genVersionName("${versionName}")
} }
@ -75,7 +75,7 @@ dependencies {
implementation 'androidx.fragment:fragment:1.1.0' implementation 'androidx.fragment:fragment:1.1.0'
implementation 'com.google.android.material:material:1.4.0' implementation 'com.google.android.material:material:1.4.0'
implementation 'cc.winboll.studio:libappbase:2.1.5' implementation 'cc.winboll.studio:libappbase:15.2.0'
implementation 'cc.winboll.studio:libapputils:9.4.4' implementation 'cc.winboll.studio:libapputils:15.2.0'
implementation 'cc.winboll.studio:libaes:7.6.12' implementation 'cc.winboll.studio:libaes:15.2.0'
} }

View File

@ -1,8 +1,8 @@
#Created by .winboll/winboll_app_build.gradle #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 stageCount=22
libraryProject= libraryProject=
baseVersion=1.0 baseVersion=15.2
publishVersion=1.0.21 publishVersion=1.0.21
buildCount=0 buildCount=5
baseBetaVersion=1.0.22 baseBetaVersion=1.0.22

View File

@ -33,6 +33,9 @@
<!-- 读取通话记录 --> <!-- 读取通话记录 -->
<uses-permission android:name="android.permission.READ_CALL_LOG"/> <uses-permission android:name="android.permission.READ_CALL_LOG"/>
<!-- 录音 -->
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<application <application
android:name=".App" android:name=".App"
android:allowBackup="true" android:allowBackup="true"

View File

@ -7,7 +7,7 @@ package cc.winboll.studio.contacts;
*/ */
import cc.winboll.studio.libappbase.GlobalApplication; import cc.winboll.studio.libappbase.GlobalApplication;
import cc.winboll.studio.libappbase.LogUtils; 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; import com.hjq.toast.ToastUtils;
public class App extends GlobalApplication { public class App extends GlobalApplication {
@ -18,7 +18,7 @@ public class App extends GlobalApplication {
public void onCreate() { public void onCreate() {
// 必须在调用基类前设置应用调试标志 // 必须在调用基类前设置应用调试标志
// 这样可以预先设置日志与数据的存储根目录 // 这样可以预先设置日志与数据的存储根目录
setIsDebuging(this, BuildConfig.DEBUG); setIsDebuging(BuildConfig.DEBUG);
super.onCreate(); super.onCreate();
// 设置 WinBoll 应用 UI 类型 // 设置 WinBoll 应用 UI 类型
WinBollActivityManager.getInstance(this).setWinBollUI_TYPE(WinBollActivityManager.WinBollUI_TYPE.Aplication); WinBollActivityManager.getInstance(this).setWinBollUI_TYPE(WinBollActivityManager.WinBollUI_TYPE.Aplication);

View File

@ -32,10 +32,10 @@ import cc.winboll.studio.contacts.fragments.CallLogFragment;
import cc.winboll.studio.contacts.fragments.ContactsFragment; import cc.winboll.studio.contacts.fragments.ContactsFragment;
import cc.winboll.studio.contacts.fragments.LogFragment; import cc.winboll.studio.contacts.fragments.LogFragment;
import cc.winboll.studio.contacts.services.MainService; 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.LogUtils;
import cc.winboll.studio.libappbase.LogView; import cc.winboll.studio.libappbase.LogView;
import cc.winboll.studio.libapputils.app.IWinBollActivity; import cc.winboll.studio.libappbase.winboll.IWinBollActivity;
import cc.winboll.studio.libapputils.bean.APPInfo;
import com.google.android.material.tabs.TabLayout; import com.google.android.material.tabs.TabLayout;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -70,12 +70,12 @@ final public class MainActivity extends AppCompatActivity implements IWinBollAct
private static final int DIALER_REQUEST_CODE = 1; private static final int DIALER_REQUEST_CODE = 1;
@Override @Override
public AppCompatActivity getActivity() { public Activity getActivity() {
return this; return this;
} }
@Override // @Override
public APPInfo getAppInfo() { // public APPInfo getAppInfo() {
// String szBranchName = "contacts"; // String szBranchName = "contacts";
// //
// APPInfo appInfo = AboutActivityFactory.buildDefaultAPPInfo(); // APPInfo appInfo = AboutActivityFactory.buildDefaultAPPInfo();
@ -90,8 +90,8 @@ final public class MainActivity extends AppCompatActivity implements IWinBollAct
// appInfo.setAppAPKName("Contacts"); // appInfo.setAppAPKName("Contacts");
// appInfo.setAppAPKFolderName("Contacts"); // appInfo.setAppAPKFolderName("Contacts");
// return appInfo; // return appInfo;
return null; // return null;
} // }
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
@ -105,10 +105,10 @@ final public class MainActivity extends AppCompatActivity implements IWinBollAct
// 初始化工具栏 // 初始化工具栏
mToolbar = findViewById(R.id.activitymainToolbar1); mToolbar = findViewById(R.id.activitymainToolbar1);
setSupportActionBar(mToolbar); setSupportActionBar(mToolbar);
if (isEnableDisplayHomeAsUp()) { // if (isEnableDisplayHomeAsUp()) {
// 显示后退按钮 // // 显示后退按钮
getSupportActionBar().setDisplayHomeAsUpEnabled(true); // getSupportActionBar().setDisplayHomeAsUpEnabled(true);
} // }
getSupportActionBar().setSubtitle(getTag()); getSupportActionBar().setSubtitle(getTag());
tabLayout = findViewById(R.id.tabLayout); tabLayout = findViewById(R.id.tabLayout);
@ -374,21 +374,6 @@ final public class MainActivity extends AppCompatActivity implements IWinBollAct
return TAG; return TAG;
} }
@Override
public Toolbar initToolBar() {
return findViewById(R.id.activitymainToolbar1);
}
@Override
public boolean isAddWinBollToolBar() {
return true;
}
@Override
public boolean isEnableDisplayHomeAsUp() {
return false;
}
// @Override // @Override
// public void onBackPressed() { // public void onBackPressed() {
// exit(); // exit();

View File

@ -34,9 +34,9 @@ import cc.winboll.studio.contacts.bobulltoon.TomCat;
import cc.winboll.studio.contacts.dun.Rules; import cc.winboll.studio.contacts.dun.Rules;
import cc.winboll.studio.contacts.services.MainService; import cc.winboll.studio.contacts.services.MainService;
import cc.winboll.studio.contacts.views.DuInfoTextView; import cc.winboll.studio.contacts.views.DuInfoTextView;
import cc.winboll.studio.libaes.winboll.APPInfo;
import cc.winboll.studio.libappbase.LogUtils; import cc.winboll.studio.libappbase.LogUtils;
import cc.winboll.studio.libapputils.app.IWinBollActivity; import cc.winboll.studio.libappbase.winboll.IWinBollActivity;
import cc.winboll.studio.libapputils.bean.APPInfo;
import com.hjq.toast.ToastUtils; import com.hjq.toast.ToastUtils;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.util.List; import java.util.List;
@ -67,11 +67,6 @@ public class SettingsActivity extends AppCompatActivity implements IWinBollActiv
private PhoneConnectRuleAdapter adapter; private PhoneConnectRuleAdapter adapter;
private List<PhoneConnectRuleModel> ruleList; private List<PhoneConnectRuleModel> ruleList;
@Override
public APPInfo getAppInfo() {
return null;
}
@Override @Override
public AppCompatActivity getActivity() { public AppCompatActivity getActivity() {
return this; return this;
@ -82,21 +77,6 @@ public class SettingsActivity extends AppCompatActivity implements IWinBollActiv
return TAG; return TAG;
} }
@Override
public Toolbar initToolBar() {
return findViewById(R.id.activitymainToolbar1);
}
@Override
public boolean isAddWinBollToolBar() {
return true;
}
@Override
public boolean isEnableDisplayHomeAsUp() {
return false;
}
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
@ -105,10 +85,8 @@ public class SettingsActivity extends AppCompatActivity implements IWinBollActiv
// 初始化工具栏 // 初始化工具栏
mToolbar = findViewById(R.id.activitymainToolbar1); mToolbar = findViewById(R.id.activitymainToolbar1);
setSupportActionBar(mToolbar); setSupportActionBar(mToolbar);
if (isEnableDisplayHomeAsUp()) { // 显示后退按钮
// 显示后退按钮 getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
getSupportActionBar().setSubtitle(getTag()); getSupportActionBar().setSubtitle(getTag());
mswMainService = findViewById(R.id.sw_mainservice); mswMainService = findViewById(R.id.sw_mainservice);
@ -232,7 +210,7 @@ public class SettingsActivity extends AppCompatActivity implements IWinBollActiv
Intent intent = new Intent(this, UnitTestActivity.class); Intent intent = new Intent(this, UnitTestActivity.class);
startActivity(intent); startActivity(intent);
} }
public void onAddNewConnectionRule(View view) { public void onAddNewConnectionRule(View view) {
Rules.getInstance(this).getPhoneBlacRuleBeanList().add(new PhoneConnectRuleModel()); Rules.getInstance(this).getPhoneBlacRuleBeanList().add(new PhoneConnectRuleModel());
Rules.getInstance(this).saveRules(); Rules.getInstance(this).saveRules();
@ -267,8 +245,8 @@ public class SettingsActivity extends AppCompatActivity implements IWinBollActiv
} }
}).start(); }).start();
} }
public void onSearchBoBullToonPhone(View view) { public void onSearchBoBullToonPhone(View view) {
TomCat tomCat = TomCat.getInstance(this); TomCat tomCat = TomCat.getInstance(this);

View File

@ -19,14 +19,11 @@ import androidx.recyclerview.widget.RecyclerView;
import cc.winboll.studio.contacts.R; import cc.winboll.studio.contacts.R;
import cc.winboll.studio.contacts.beans.PhoneConnectRuleModel; import cc.winboll.studio.contacts.beans.PhoneConnectRuleModel;
import cc.winboll.studio.contacts.dun.Rules; 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.ArrayList;
import java.util.List; 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> { public class PhoneConnectRuleAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

View File

@ -7,26 +7,52 @@ package cc.winboll.studio.contacts.phonecallui;
* @see PhoneCallActivity * @see PhoneCallActivity
* @see android.telecom.InCallService * @see android.telecom.InCallService
*/ */
import android.content.ContentResolver;
import android.database.Cursor;
import android.media.AudioManager; import android.media.AudioManager;
import android.media.MediaRecorder;
import android.net.Uri;
import android.os.Build; import android.os.Build;
import android.provider.CallLog;
import android.telecom.Call; import android.telecom.Call;
import android.telecom.InCallService; import android.telecom.InCallService;
import android.telephony.TelephonyManager;
import androidx.annotation.RequiresApi; import androidx.annotation.RequiresApi;
import cc.winboll.studio.contacts.ActivityStack; import cc.winboll.studio.contacts.ActivityStack;
import cc.winboll.studio.contacts.beans.RingTongBean; import cc.winboll.studio.contacts.beans.RingTongBean;
import cc.winboll.studio.contacts.dun.Rules; import cc.winboll.studio.contacts.dun.Rules;
import cc.winboll.studio.libappbase.LogUtils; import cc.winboll.studio.libappbase.LogUtils;
import java.io.File;
import java.io.IOException;
@RequiresApi(api = Build.VERSION_CODES.M) @RequiresApi(api = Build.VERSION_CODES.M)
public class PhoneCallService extends InCallService { public class PhoneCallService extends InCallService {
public static final String TAG = "PhoneCallService"; public static final String TAG = "PhoneCallService";
MediaRecorder mediaRecorder;
private final Call.Callback callback = new Call.Callback() { private final Call.Callback callback = new Call.Callback() {
@Override @Override
public void onStateChanged(Call call, int state) { public void onStateChanged(Call call, int state) {
super.onStateChanged(call, state); super.onStateChanged(call, state);
switch (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: { case Call.STATE_ACTIVE: {
break; break;
} }
@ -127,4 +153,56 @@ public class PhoneCallService extends InCallService {
CALL_IN, CALL_IN,
CALL_OUT, 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;
}
} }