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/build/generated/aidl_source_output_dir/debug/out/com/safeluck/floatwindow/IMyCallback.java         |    2 
 key/key.jks                                                                                            |    0 
 key/keyrk3288.jks                                                                                      |    0 
 app/src/main/java/com/safeluck/floatwindow/MediaArgu.java                                              |    1 
 app/build/generated/aidl_source_output_dir/debug/out/com/safeluck/floatwindow/IMediaAidlInterface.java |    2 
 app/src/main/AndroidManifest.xml                                                                       |    6 
 app/src/main/java/com/safeluck/floatwindow/util/VideoFileUtils.java                                    |    3 
 app/src/main/java/com/safeluck/floatwindow/MainActivity.kt                                             |  334 +++++++++++++++++++++++++++++++++++++++++++++++++++---
 key/key.jks.ori                                                                                        |    0 
 key/keysc200.jks                                                                                       |    0 
 keystore.properties                                                                                    |    4 
 key/keysc626.jks                                                                                       |    0 
 12 files changed, 324 insertions(+), 28 deletions(-)

diff --git a/app/build/generated/aidl_source_output_dir/debug/out/com/safeluck/floatwindow/IMediaAidlInterface.java b/app/build/generated/aidl_source_output_dir/debug/out/com/safeluck/floatwindow/IMediaAidlInterface.java
index e24d126..ed3fbf5 100644
--- a/app/build/generated/aidl_source_output_dir/debug/out/com/safeluck/floatwindow/IMediaAidlInterface.java
+++ b/app/build/generated/aidl_source_output_dir/debug/out/com/safeluck/floatwindow/IMediaAidlInterface.java
@@ -1,6 +1,6 @@
 /*
  * This file is auto-generated.  DO NOT MODIFY.
- * Using: D:\Program\ Files\Android\Sdk\build-tools\35.0.0\aidl.exe -pD:\Program\ Files\Android\Sdk\platforms\android-35\framework.aidl -oD:\JetBrainsProjects\AndroidProject\anyunVideo\app\build\generated\aidl_source_output_dir\debug\out -ID:\JetBrainsProjects\AndroidProject\anyunVideo\app\src\main\aidl -ID:\JetBrainsProjects\AndroidProject\anyunVideo\app\src\debug\aidl -ID:\data\.gradle\caches\8.10.2\transforms\53a750d70626c759bd7a6dbaf50185ee\transformed\core-1.12.0\aidl -ID:\data\.gradle\caches\8.10.2\transforms\dc945394860d4e1c7d02ff0c8d3e2e6f\transformed\versionedparcelable-1.1.1\aidl -dC:\Users\Dana\AppData\Local\Temp\aidl14282392422309074909.d D:\JetBrainsProjects\AndroidProject\anyunVideo\app\src\main\aidl\com\safeluck\floatwindow\IMediaAidlInterface.aidl
+ * Using: D:\Program\ Files\Android\Sdk\build-tools\35.0.0\aidl.exe -pD:\Program\ Files\Android\Sdk\platforms\android-35\framework.aidl -oD:\JetBrainsProjects\AndroidProject\anyunVideo\app\build\generated\aidl_source_output_dir\debug\out -ID:\JetBrainsProjects\AndroidProject\anyunVideo\app\src\main\aidl -ID:\JetBrainsProjects\AndroidProject\anyunVideo\app\src\debug\aidl -ID:\data\.gradle\caches\8.10.2\transforms\53a750d70626c759bd7a6dbaf50185ee\transformed\core-1.12.0\aidl -ID:\data\.gradle\caches\8.10.2\transforms\dc945394860d4e1c7d02ff0c8d3e2e6f\transformed\versionedparcelable-1.1.1\aidl -dC:\Users\Dana\AppData\Local\Temp\aidl1635290626695601630.d D:\JetBrainsProjects\AndroidProject\anyunVideo\app\src\main\aidl\com\safeluck\floatwindow\IMediaAidlInterface.aidl
  */
 package com.safeluck.floatwindow;
 // Declare any non-default types here with import statements
diff --git a/app/build/generated/aidl_source_output_dir/debug/out/com/safeluck/floatwindow/IMyCallback.java b/app/build/generated/aidl_source_output_dir/debug/out/com/safeluck/floatwindow/IMyCallback.java
index db127f2..57e9e91 100644
--- a/app/build/generated/aidl_source_output_dir/debug/out/com/safeluck/floatwindow/IMyCallback.java
+++ b/app/build/generated/aidl_source_output_dir/debug/out/com/safeluck/floatwindow/IMyCallback.java
@@ -1,6 +1,6 @@
 /*
  * This file is auto-generated.  DO NOT MODIFY.
- * Using: D:\Program\ Files\Android\Sdk\build-tools\35.0.0\aidl.exe -pD:\Program\ Files\Android\Sdk\platforms\android-35\framework.aidl -oD:\JetBrainsProjects\AndroidProject\anyunVideo\app\build\generated\aidl_source_output_dir\debug\out -ID:\JetBrainsProjects\AndroidProject\anyunVideo\app\src\main\aidl -ID:\JetBrainsProjects\AndroidProject\anyunVideo\app\src\debug\aidl -ID:\data\.gradle\caches\8.10.2\transforms\53a750d70626c759bd7a6dbaf50185ee\transformed\core-1.12.0\aidl -ID:\data\.gradle\caches\8.10.2\transforms\dc945394860d4e1c7d02ff0c8d3e2e6f\transformed\versionedparcelable-1.1.1\aidl -dC:\Users\Dana\AppData\Local\Temp\aidl6375257616930721574.d D:\JetBrainsProjects\AndroidProject\anyunVideo\app\src\main\aidl\com\safeluck\floatwindow\IMyCallback.aidl
+ * Using: D:\Program\ Files\Android\Sdk\build-tools\35.0.0\aidl.exe -pD:\Program\ Files\Android\Sdk\platforms\android-35\framework.aidl -oD:\JetBrainsProjects\AndroidProject\anyunVideo\app\build\generated\aidl_source_output_dir\debug\out -ID:\JetBrainsProjects\AndroidProject\anyunVideo\app\src\main\aidl -ID:\JetBrainsProjects\AndroidProject\anyunVideo\app\src\debug\aidl -ID:\data\.gradle\caches\8.10.2\transforms\53a750d70626c759bd7a6dbaf50185ee\transformed\core-1.12.0\aidl -ID:\data\.gradle\caches\8.10.2\transforms\dc945394860d4e1c7d02ff0c8d3e2e6f\transformed\versionedparcelable-1.1.1\aidl -dC:\Users\Dana\AppData\Local\Temp\aidl7435277295093533370.d D:\JetBrainsProjects\AndroidProject\anyunVideo\app\src\main\aidl\com\safeluck\floatwindow\IMyCallback.aidl
  */
 package com.safeluck.floatwindow;
 /**
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index c7e748d..fbd24eb 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -1,10 +1,12 @@
 <?xml version="1.0" encoding="utf-8"?>
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools">
+    android:sharedUserId="android.uid.system"
+    xmlns:tools="http://schemas.android.com/tools"
+    >
 
     <uses-permission android:name="android.permission.CAMERA" />
     <uses-permission android:name="android.permission.RECORD_AUDIO" />
-
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
     <application
         android:allowBackup="true"
         android:name=".H264Application"
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
+}
diff --git a/app/src/main/java/com/safeluck/floatwindow/MediaArgu.java b/app/src/main/java/com/safeluck/floatwindow/MediaArgu.java
index 4d8ebb1..dff6790 100644
--- a/app/src/main/java/com/safeluck/floatwindow/MediaArgu.java
+++ b/app/src/main/java/com/safeluck/floatwindow/MediaArgu.java
@@ -107,6 +107,7 @@
         this.pwd = pwd;
     }
 
+
   public  static class ScreenSolution implements Parcelable {
         int width;
         int height;
diff --git a/app/src/main/java/com/safeluck/floatwindow/util/VideoFileUtils.java b/app/src/main/java/com/safeluck/floatwindow/util/VideoFileUtils.java
index c51d1d3..d9b0128 100644
--- a/app/src/main/java/com/safeluck/floatwindow/util/VideoFileUtils.java
+++ b/app/src/main/java/com/safeluck/floatwindow/util/VideoFileUtils.java
@@ -1,6 +1,7 @@
 package com.safeluck.floatwindow.util;
 
 import android.content.Context;
+import android.os.Environment;
 
 import timber.log.Timber;
 
@@ -36,7 +37,7 @@
             baseDir = new File(storagePath);
         } else {
             // 鍐呴儴瀛樺偍
-            baseDir = context.getFilesDir();
+            baseDir = Environment.getExternalStorageDirectory();
         }
         
         // 鍒涘缓 AnYun_VIDEO 鐩綍
diff --git a/key/key.jks b/key/key.jks
new file mode 100644
index 0000000..7b43d77
--- /dev/null
+++ b/key/key.jks
Binary files differ
diff --git a/key/key.jks.ori b/key/key.jks.ori
new file mode 100644
index 0000000..3908383
--- /dev/null
+++ b/key/key.jks.ori
Binary files differ
diff --git a/key/keyrk3288.jks b/key/keyrk3288.jks
new file mode 100644
index 0000000..2f65bee
--- /dev/null
+++ b/key/keyrk3288.jks
Binary files differ
diff --git a/key/keysc200.jks b/key/keysc200.jks
new file mode 100644
index 0000000..9fd3690
--- /dev/null
+++ b/key/keysc200.jks
Binary files differ
diff --git a/key/keysc626.jks b/key/keysc626.jks
new file mode 100644
index 0000000..bb729ce
--- /dev/null
+++ b/key/keysc626.jks
Binary files differ
diff --git a/keystore.properties b/keystore.properties
new file mode 100644
index 0000000..4504553
--- /dev/null
+++ b/keystore.properties
@@ -0,0 +1,4 @@
+storePassword = 123456
+keyPassword = 123456
+keyAlias = key0
+storeFile = ../key/key.jks
\ No newline at end of file

--
Gitblit v1.8.0