最近在做项目,对讲应用放在后台,录音无声音,最后解决。
一 现象
对讲应用运行在后台,录音无效查看日志,AudioRecorder录音回调全是0;状态栏无通知,无申请通知权限。
二解决
看了现象应该能够猜测到解决方案了。让应用在后台运行不被挂起,需要申请通知权限,然后创建通知在状态栏显示,防止应用被挂起。
1 申请通知权限
AndroidManifest.xml中
html
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
2 代码检查权限
java
private final ActivityResultLauncher<String> requestPermissionLauncher = registerForActivityResult(
new ActivityResultContracts.RequestPermission(),
result -> {
if (result == null || !result) {
// 用户不允许权限,处理拒绝的情况
ToastUtil.getInstance().show("请授予通知权限");
} else {
// 用户允许权限,处理接受的情况
}
});
@RequiresApi(api = Build.VERSION_CODES.TIRAMISU)
public void requestPermission() {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED) {
// 权限未被授予,向用户请求权限
requestPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS);
} else {
// 权限已经被授予,可以执行操作
}
}
3 创建通知栏 ,在service中创建
java
@SuppressLint("NotificationPermission")
private void showMessageNotification(String data) {
Log.e(TAG, "showMessageNotification data: " + data);
String type = data.substring(0, 2);
String a = ConvertUtil.convertBigModel(data.substring(2, 10));
//短信发送方号码
String number = String.valueOf(Long.parseLong(a, 16));
//联系人号码
// String b = ConvertUtil.convertBigModel(data.substring(10, 18));
// String number1 = String.valueOf(Long.parseLong(b, 16));
String text = ConvertUtil.unicodeToString(data.substring(10));
Log.e(TAG, "showMessageNotification: " + data);
// 为该通知设置一个id
int notifyID = 1;
daoManager = DaoManager.getInstance(this);
smsLists = daoManager.querySmsList();
if (smsLists != null && smsLists.size() > 0) {
SmsList sms = daoManager.querySms(smsLists.get(smsLists.size() - 1).getId());
notifyID = (int) (sms.getId() + 1);
}
int current = SPUtil.getInt(this, Constant.CHANNEL_INDEX, Constant.CHANNEL_INDEX_DEFAULT);
list = new SmsList(notifyID, System.currentTimeMillis(), current, type, number, text, false);
daoManager.insertSmsList(list);
//创建通知
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
// 通知渠道的id
String id = "my_channel_dmr_message";
int importance = NotificationManager.IMPORTANCE_DEFAULT;
NotificationChannel mChannel = new NotificationChannel(id, number, importance);
mChannel.setShowBadge(true);
mChannel.setName(getString(R.string.message));
mNotificationManager.createNotificationChannel(mChannel);
//设置点击事件
Intent clickIntent = new Intent(this, SmsActivity.class);
clickIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent clearIntent = PendingIntent.getActivity(this, 0, clickIntent, PendingIntent.FLAG_IMMUTABLE);
// 通知渠道的id
String CHANNEL_ID = "my_channel_dmr_message";
// Create a notification and set the notification channel.
Notification notification = new Notification.Builder(this, CHANNEL_ID)
.setAutoCancel(true)
.setShowWhen(true)
.setContentIntent(clearIntent)
.setContentTitle(number)
.setContentText(text)
.setSmallIcon(R.drawable.icon_message)
.setChannelId(CHANNEL_ID)
.build();
mNotificationManager.notify(notifyID, notification);
}
}
4 在AndroidManifest.xml中给service增加audioRecorder使用权限
html
<service
android:priority="1000"
+ android:foregroundServiceType="microphone"
android:name=".server.BoService" />
END~