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