更新类库版本
This commit is contained in:
parent
473dd627fe
commit
1a571684ca
@ -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'
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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"
|
||||||
|
@ -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);
|
||||||
|
@ -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();
|
||||||
|
@ -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);
|
||||||
|
@ -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> {
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user