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