From 9ec246ab9aa31b4c8e1e90490bce17a6e908b3e3 Mon Sep 17 00:00:00 2001
From: Dana <Dana_Lee1016@126.com>
Date: 星期二, 27 一月 2026 10:52:58 +0800
Subject: [PATCH] 1.MainActivity添加按钮 功能 2.内部相机可以录像 3. sdcard/anyun_VIDEO 目录下 4.没有音频
---
app/src/main/java/com/safeluck/floatwindow/MainActivity.kt | 334 +++++++++++++++++++++++++++++++++++++++++++++++++++---
1 files changed, 311 insertions(+), 23 deletions(-)
diff --git a/app/src/main/java/com/safeluck/floatwindow/MainActivity.kt b/app/src/main/java/com/safeluck/floatwindow/MainActivity.kt
index fe38740..4d19696 100644
--- a/app/src/main/java/com/safeluck/floatwindow/MainActivity.kt
+++ b/app/src/main/java/com/safeluck/floatwindow/MainActivity.kt
@@ -1,47 +1,335 @@
package com.safeluck.floatwindow
+import android.content.ComponentName
+import android.content.Context
+import android.content.Intent
+import android.content.ServiceConnection
import android.os.Bundle
+import android.os.IBinder
+import android.os.RemoteException
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
-import androidx.compose.foundation.layout.fillMaxSize
-import androidx.compose.foundation.layout.padding
-import androidx.compose.material3.Scaffold
-import androidx.compose.material3.Text
-import androidx.compose.runtime.Composable
+import androidx.compose.foundation.layout.*
+import androidx.compose.material3.*
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.*
+import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
-import androidx.compose.ui.tooling.preview.Preview
+import androidx.compose.ui.unit.dp
import com.safeluck.floatwindow.ui.theme.AnyunVideoTheme
+import timber.log.Timber
class MainActivity : ComponentActivity() {
+ private var mediaAidlInterface: IMediaAidlInterface? = null
+
+ private val callback = object : IMyCallback.Stub() {
+ @Throws(RemoteException::class)
+ override fun onResult(re: ResponseVO?) {
+ re?.let {
+ Timber.d("Callback received: type=${it.type}, errCode=${it.errCode}, message=${it.message}")
+ }
+ }
+ }
+
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
+
+ var isServiceBoundState by mutableStateOf(false)
+
+ val serviceConnection = object : ServiceConnection {
+ override fun onServiceConnected(name: ComponentName?, service: IBinder?) {
+ mediaAidlInterface = IMediaAidlInterface.Stub.asInterface(service)
+ isServiceBoundState = true
+ Timber.d("FloatingService connected")
+ }
+
+ override fun onServiceDisconnected(name: ComponentName?) {
+ mediaAidlInterface = null
+ isServiceBoundState = false
+ Timber.d("FloatingService disconnected")
+ }
+ }
+
setContent {
AnyunVideoTheme {
- Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding ->
- Greeting(
- name = "Android",
- modifier = Modifier.padding(innerPadding)
+ Surface(
+ modifier = Modifier.fillMaxSize(),
+ color = MaterialTheme.colorScheme.background
+ ) {
+ MainScreen(
+ isServiceBound = isServiceBoundState,
+ onBindService = {
+ if (!isServiceBoundState) {
+ val intent = Intent(this@MainActivity, FloatingService::class.java)
+ bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE)
+ Timber.d("Binding FloatingService")
+ }
+ },
+ onUnbindService = {
+ if (isServiceBoundState) {
+ try {
+ mediaAidlInterface?.unregisterCallback(callback)
+ } catch (e: RemoteException) {
+ Timber.e(e, "Error unregistering callback")
+ }
+ unbindService(serviceConnection)
+ isServiceBoundState = false
+ mediaAidlInterface = null
+ Timber.d("Unbinding FloatingService")
+ }
+ },
+ onStartAndroidRecord = { startAndroidRecord() },
+ onStopAndroidRecord = { stopAndroidRecord() },
+ onStartUsbRecord = { startUsbRecord() },
+ onStopUsbRecord = { stopUsbRecord() },
+ onStartUsbPush = { startUsbPush() },
+ onStopUsbPush = { stopUsbPush() }
)
}
+ }
+ }
+ }
+
+ private fun startAndroidRecord() {
+ if (mediaAidlInterface == null) {
+ Timber.w("Service not bound, cannot start Android record")
+ return
+ }
+
+ try {
+ val mediaArgu = MediaArgu().apply {
+ isPush = false
+ isUsedOutCamera = false // Android 鍐呯疆鎽勫儚澶�
+ codeRate = 0
+ frameRate = 0
+ m_screen = MediaArgu.ScreenSolution(640, 480) // 榛樿鍒嗚鲸鐜�
+ recordTime = 0
+ tfCardFlag = 0 // 鍐呴儴瀛樺偍
+ }
+
+ mediaAidlInterface?.registerCallback(callback)
+ mediaAidlInterface?.startMedia(mediaArgu)
+ Timber.d("Started Android camera record")
+ } catch (e: RemoteException) {
+ Timber.e(e, "Error starting Android record")
+ }
+ }
+
+ private fun stopAndroidRecord() {
+ if (mediaAidlInterface == null) {
+ Timber.w("Service not bound, cannot stop Android record")
+ return
+ }
+
+ try {
+ mediaAidlInterface?.stopMedia()
+ Timber.d("Stopped Android camera record")
+ } catch (e: RemoteException) {
+ Timber.e(e, "Error stopping Android record")
+ }
+ }
+
+ private fun startUsbRecord() {
+ if (mediaAidlInterface == null) {
+ Timber.w("Service not bound, cannot start USB record")
+ return
+ }
+
+ try {
+ val mediaArgu = MediaArgu().apply {
+ isPush = false
+ isUsedOutCamera = true // USB 鎽勫儚澶�
+ codeRate = 0
+ frameRate = 0
+ m_screen = MediaArgu.ScreenSolution(640, 480) // 榛樿鍒嗚鲸鐜�
+ recordTime = 0
+ tfCardFlag = 0 // 鍐呴儴瀛樺偍
+ }
+
+ mediaAidlInterface?.registerCallback(callback)
+ mediaAidlInterface?.startMedia(mediaArgu)
+ Timber.d("Started USB camera record")
+ } catch (e: RemoteException) {
+ Timber.e(e, "Error starting USB record")
+ }
+ }
+
+ private fun stopUsbRecord() {
+ if (mediaAidlInterface == null) {
+ Timber.w("Service not bound, cannot stop USB record")
+ return
+ }
+
+ try {
+ mediaAidlInterface?.stopMedia()
+ Timber.d("Stopped USB camera record")
+ } catch (e: RemoteException) {
+ Timber.e(e, "Error stopping USB record")
+ }
+ }
+
+ private fun startUsbPush() {
+ if (mediaAidlInterface == null) {
+ Timber.w("Service not bound, cannot start USB push")
+ return
+ }
+
+ try {
+ val mediaArgu = MediaArgu().apply {
+ isPush = true
+ isUsedOutCamera = true // USB 鎽勫儚澶�
+ codeRate = 0
+ frameRate = 0
+ m_screen = MediaArgu.ScreenSolution(640, 480) // 榛樿鍒嗚鲸鐜�
+ url = "rtmp://your-push-url" // TODO: 闇�瑕佽缃疄闄呯殑鎺ㄦ祦鍦板潃
+ userName = ""
+ pwd = ""
+ }
+
+ mediaAidlInterface?.registerCallback(callback)
+ mediaAidlInterface?.startMedia(mediaArgu)
+ Timber.d("Started USB camera push")
+ } catch (e: RemoteException) {
+ Timber.e(e, "Error starting USB push")
+ }
+ }
+
+ private fun stopUsbPush() {
+ if (mediaAidlInterface == null) {
+ Timber.w("Service not bound, cannot stop USB push")
+ return
+ }
+
+ try {
+ mediaAidlInterface?.stopMedia()
+ Timber.d("Stopped USB camera push")
+ } catch (e: RemoteException) {
+ Timber.e(e, "Error stopping USB push")
+ }
+ }
+
+ override fun onDestroy() {
+ super.onDestroy()
+ if (mediaAidlInterface != null) {
+ try {
+ mediaAidlInterface?.unregisterCallback(callback)
+ } catch (e: RemoteException) {
+ Timber.e(e, "Error unregistering callback")
}
}
}
}
@Composable
-fun Greeting(name: String, modifier: Modifier = Modifier) {
- Text(
- text = "Hello $name!",
- modifier = modifier
- )
-}
-
-@Preview(showBackground = true)
-@Composable
-fun GreetingPreview() {
- AnyunVideoTheme {
- Greeting("Android")
+fun MainScreen(
+ isServiceBound: Boolean,
+ onBindService: () -> Unit,
+ onUnbindService: () -> Unit,
+ onStartAndroidRecord: () -> Unit,
+ onStopAndroidRecord: () -> Unit,
+ onStartUsbRecord: () -> Unit,
+ onStopUsbRecord: () -> Unit,
+ onStartUsbPush: () -> Unit,
+ onStopUsbPush: () -> Unit
+) {
+ Column(
+ modifier = Modifier
+ .fillMaxSize()
+ .padding(16.dp),
+ horizontalAlignment = Alignment.CenterHorizontally,
+ verticalArrangement = Arrangement.spacedBy(12.dp)
+ ) {
+ Text(
+ text = "FloatingService 鎺у埗",
+ style = MaterialTheme.typography.headlineMedium,
+ modifier = Modifier.padding(bottom = 8.dp)
+ )
+
+ Text(
+ text = if (isServiceBound) "鏈嶅姟鐘舵��: 宸茬粦瀹�" else "鏈嶅姟鐘舵��: 鏈粦瀹�",
+ style = MaterialTheme.typography.bodyMedium,
+ color = if (isServiceBound) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.error,
+ modifier = Modifier.padding(bottom = 16.dp)
+ )
+
+ // 鎸夐挳 1: 缁戝畾鏈嶅姟
+ Button(
+ onClick = onBindService,
+ modifier = Modifier.fillMaxWidth(),
+ enabled = !isServiceBound
+ ) {
+ Text("1. 缁戝畾 FloatingService")
+ }
+
+ // 鎸夐挳 2: 瑙g粦鏈嶅姟
+ Button(
+ onClick = onUnbindService,
+ modifier = Modifier.fillMaxWidth(),
+ enabled = isServiceBound
+ ) {
+ Text("2. 瑙g粦 FloatingService")
+ }
+
+ Divider(modifier = Modifier.padding(vertical = 8.dp))
+
+ // 鎸夐挳 3: 寮�濮� Android 鐩告満褰曞儚
+ Button(
+ onClick = onStartAndroidRecord,
+ modifier = Modifier.fillMaxWidth(),
+ enabled = isServiceBound
+ ) {
+ Text("3. 寮�濮� Android 鐩告満褰曞儚")
+ }
+
+ // 鎸夐挳 4: 缁撴潫 Android 鐩告満褰曞儚
+ Button(
+ onClick = onStopAndroidRecord,
+ modifier = Modifier.fillMaxWidth(),
+ enabled = isServiceBound
+ ) {
+ Text("4. 缁撴潫 Android 鐩告満褰曞儚")
+ }
+
+ Divider(modifier = Modifier.padding(vertical = 8.dp))
+
+ // 鎸夐挳 5: 寮�濮� USB 鐩告満褰曞儚
+ Button(
+ onClick = onStartUsbRecord,
+ modifier = Modifier.fillMaxWidth(),
+ enabled = isServiceBound
+ ) {
+ Text("5. 寮�濮� USB 鐩告満褰曞儚")
+ }
+
+ // 鎸夐挳 6: 缁撴潫 USB 鐩告満褰曞儚
+ Button(
+ onClick = onStopUsbRecord,
+ modifier = Modifier.fillMaxWidth(),
+ enabled = isServiceBound
+ ) {
+ Text("6. 缁撴潫 USB 鐩告満褰曞儚")
+ }
+
+ Divider(modifier = Modifier.padding(vertical = 8.dp))
+
+ // 鎸夐挳 7: 寮�濮� USB 鎺ㄦ祦
+ Button(
+ onClick = onStartUsbPush,
+ modifier = Modifier.fillMaxWidth(),
+ enabled = isServiceBound
+ ) {
+ Text("7. 寮�濮� USB 鎺ㄦ祦")
+ }
+
+ // 鎸夐挳 8: 缁撴潫 USB 鎺ㄦ祦
+ Button(
+ onClick = onStopUsbPush,
+ modifier = Modifier.fillMaxWidth(),
+ enabled = isServiceBound
+ ) {
+ Text("8. 缁撴潫 USB 鎺ㄦ祦")
+ }
}
-}
\ No newline at end of file
+}
--
Gitblit v1.8.0