build: rename package

This commit is contained in:
2026-07-14 01:17:17 +08:00
parent 35993ecb91
commit 6af1f945ad
9 changed files with 19 additions and 30 deletions

View File

@@ -0,0 +1,202 @@
package com.ttstd.controlled;
import android.Manifest;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.content.pm.PackageManager;
import android.media.projection.MediaProjectionManager;
import android.os.Build;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import com.ttstd.controlled.service.ScreenCaptureService;
import com.ttstd.controlled.webrtc.WebRtcClient;
import org.webrtc.RendererCommon;
import org.webrtc.SurfaceViewRenderer;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "ControlledMain";
private static final int REQUEST_MEDIA_PROJECTION = 1001;
private static final int REQUEST_NOTIFICATION_PERMISSION = 1002;
private EditText etServerUrl;
private EditText etDeviceId;
private Button btnStart;
private Button btnStop;
private TextView tvStatus;
private SurfaceViewRenderer localView;
private boolean isServiceRunning = false;
private ScreenCaptureService screenCaptureService;
private boolean isBound = false;
private boolean isLocalViewInitialized = false;
private final ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
ScreenCaptureService.LocalBinder binder = (ScreenCaptureService.LocalBinder) service;
screenCaptureService = binder.getService();
isBound = true;
setupLocalPreview();
}
@Override
public void onServiceDisconnected(ComponentName name) {
isBound = false;
screenCaptureService = null;
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
etServerUrl = findViewById(R.id.et_server_url);
etDeviceId = findViewById(R.id.et_device_id);
btnStart = findViewById(R.id.btn_start);
btnStop = findViewById(R.id.btn_stop);
tvStatus = findViewById(R.id.tv_status);
localView = findViewById(R.id.local_view);
// 默认服务器地址
etServerUrl.setText("ws://192.168.100.222:8080/ws/signal");
// 生成设备ID
// etDeviceId.setText("controlled_" + UUID.randomUUID().toString().substring(0, 8));
btnStart.setOnClickListener(v -> startScreenSharing());
btnStop.setOnClickListener(v -> stopScreenSharing());
updateUI(false);
}
private void startScreenSharing() {
// 检查通知权限 (Android 13+)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.POST_NOTIFICATIONS},
REQUEST_NOTIFICATION_PERMISSION);
return;
}
}
// 请求屏幕录制权限
MediaProjectionManager projectionManager =
(MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE);
startActivityForResult(projectionManager.createScreenCaptureIntent(), REQUEST_MEDIA_PROJECTION);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_MEDIA_PROJECTION) {
if (resultCode == RESULT_OK && data != null) {
Intent serviceIntent = new Intent(this, ScreenCaptureService.class);
serviceIntent.putExtra(ScreenCaptureService.EXTRA_RESULT_CODE, resultCode);
serviceIntent.putExtra(ScreenCaptureService.EXTRA_RESULT_DATA, data);
serviceIntent.putExtra(ScreenCaptureService.EXTRA_SERVER_URL, etServerUrl.getText().toString());
serviceIntent.putExtra(ScreenCaptureService.EXTRA_DEVICE_ID, etDeviceId.getText().toString());
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
startForegroundService(serviceIntent);
} else {
startService(serviceIntent);
}
bindService(serviceIntent, serviceConnection, BIND_AUTO_CREATE);
updateUI(true);
Toast.makeText(this, "屏幕共享已启动", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "屏幕录制权限被拒绝", Toast.LENGTH_SHORT).show();
}
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_NOTIFICATION_PERMISSION) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
startScreenSharing();
} else {
Toast.makeText(this, "需要通知权限才能运行", Toast.LENGTH_SHORT).show();
}
}
}
private void stopScreenSharing() {
if (isBound) {
unbindService(serviceConnection);
isBound = false;
}
Intent serviceIntent = new Intent(this, ScreenCaptureService.class);
stopService(serviceIntent);
if (localView != null) {
localView.release();
isLocalViewInitialized = false;
}
updateUI(false);
Toast.makeText(this, "屏幕共享已停止", Toast.LENGTH_SHORT).show();
}
private void setupLocalPreview() {
if (isBound && screenCaptureService != null && !isLocalViewInitialized) {
WebRtcClient webRtcClient = screenCaptureService.getWebRtcClient();
if (webRtcClient != null && webRtcClient.getEglContext() != null) {
try {
localView.init(webRtcClient.getEglContext(), null);
localView.setScalingType(RendererCommon.ScalingType.SCALE_ASPECT_FIT);
localView.setMirror(false);
webRtcClient.setLocalSink(localView);
isLocalViewInitialized = true;
} catch (Exception e) {
Log.e(TAG, "Error initializing local view", e);
}
} else {
// 如果 webRtcClient 还没准备好,稍后重试
localView.postDelayed(this::setupLocalPreview, 500);
}
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (isBound) {
unbindService(serviceConnection);
isBound = false;
}
if (localView != null) {
localView.release();
isLocalViewInitialized = false;
}
}
private void updateUI(boolean running) {
isServiceRunning = running;
btnStart.setEnabled(!running);
btnStop.setEnabled(running);
etServerUrl.setEnabled(!running);
etDeviceId.setEnabled(!running);
tvStatus.setText(running ? "状态: 运行中" : "状态: 已停止");
}
}