Медиапроекция для меня очень сложнаJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Медиапроекция для меня очень сложна

Сообщение Anonymous »

Добрый вечер всем, мне нужно записать системный звук Android через Android MediaProjection API.
Я использую React Native, но я легко могу общаться с Java и могу использовать nuild. без ошибок, но как только я запускаю start(), мое приложение вылетает, не понимая причины.
вот код, можете мне помочь, пожалуйста?
package com.reactnativescreenaudiorecorder;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.media.AudioFormat;
import android.media.projection.MediaProjection;
import android.media.projection.MediaProjectionManager;
import android.os.Build;
import android.os.IBinder;
import android.util.Log;
import androidx.annotation.NonNull;

import com.facebook.react.bridge.ActivityEventListener;
import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.ReadableMap;
import com.facebook.react.module.annotations.ReactModule;
import com.facebook.react.modules.core.DeviceEventManagerModule;

import java.util.Objects;

@ReactModule(name = ScreenAudioRecorderModule.NAME)
public class ScreenAudioRecorderModule extends ReactContextBaseJavaModule implements ActivityEventListener {

public static final String NAME = "ScreenAudioRecorder";
private final ReactApplicationContext reactContext;

private MediaProjectionManager mediaProjectionManager;
private MediaProjection mediaProjection;
private ScreenAudioRecorderService recordService;
private ReadableMap options;

public static final int MEDIA_PROJECTION_REQUEST_CODE = 1001;

public ScreenAudioRecorderModule(ReactApplicationContext reactContext) {
super(reactContext);
this.reactContext = reactContext;
this.reactContext.addActivityEventListener(this);
}

private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName className, IBinder service) {
try{
ScreenAudioRecorderService.ScreenAudioRecorder binder = (ScreenAudioRecorderService.ScreenAudioRecorder) service;
recordService = binder.getRecordService();

recordService.setSampleRateInHz(44100);
if (options.hasKey("sampleRate")) {
recordService.setSampleRateInHz(options.getInt("sampleRate"));
}

recordService.setChannelConfig(AudioFormat.CHANNEL_IN_MONO);
if (options.hasKey("channels")) {
if (options.getInt("channels") == 2) {
recordService.setChannelConfig(AudioFormat.CHANNEL_IN_STEREO);
}
}

recordService.setAudioFormat(AudioFormat.ENCODING_PCM_16BIT);
if (options.hasKey("bitsPerSample")) {
if (options.getInt("bitsPerSample") == 8) {
recordService.setAudioFormat(AudioFormat.ENCODING_PCM_8BIT);
}
}

recordService.setAudioEmitInterval(100);
if (options.hasKey("audioEmitInterval")) {
recordService.setAudioEmitInterval(options.getInt("audioEmitInterval"));
}

Boolean fromMic = false;
recordService.setFromMic(false);
if (options.hasKey("fromMic")) {
fromMic = options.getBoolean("fromMic");
recordService.setFromMic(options.getBoolean("fromMic"));
}

String documentDirectoryPath = getReactApplicationContext().getFilesDir().getAbsolutePath();

recordService.setOutFile(documentDirectoryPath + "/" + "audio.wav");
if (options.hasKey("fileName")) {
recordService.setOutFile(documentDirectoryPath + "/" + options.getString("fileName"));
}

recordService.setSaveFile(false);
if (options.hasKey("saveFile")) {
recordService.setSaveFile(options.getBoolean("saveFile"));
}

recordService.calcBufferSize();
recordService.calcRecordingBufferSize();
recordService.setTmpFile(documentDirectoryPath + "/" + "temp.pcm");
recordService.setEventEmitter(reactContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class));

if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && !fromMic) {
mediaProjectionManager = (MediaProjectionManager) getCurrentActivity().getSystemService(reactContext.MEDIA_PROJECTION_SERVICE);
Intent captureIntent = mediaProjectionManager.createScreenCaptureIntent();
reactContext.startActivityForResult(captureIntent, MEDIA_PROJECTION_REQUEST_CODE, null);
}
else
{
recordService.startAudioCapture();
}

}
catch(Exception e) {
e.printStackTrace();
}

}

@Override
public void onServiceDisconnected(ComponentName arg0) {}
};

@Override
public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) {
if (requestCode == MEDIA_PROJECTION_REQUEST_CODE && resultCode == Activity.RESULT_OK) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
if (mediaProjectionManager != null && data != null) {
mediaProjection = mediaProjectionManager.getMediaProjection(resultCode, data);
recordService.setMediaProject(mediaProjection);
recordService.startAudioCapture();
} else {
throw new IllegalStateException("MediaProjectionManager or data is null.");
}
}
}
}

@Override
public void onNewIntent(Intent intent) { }

@Override
@NonNull
public String getName() {
return NAME;
}

@ReactMethod
public void init(ReadableMap options) {
this.options = options;
}

@ReactMethod
public void start(){
Log.d(NAME, "Avvio del servizio audio...");
Activity activity = getCurrentActivity();
if (activity == null) {
throw new IllegalStateException("Current activity is null. Ensure that start() is called when the app is in the foreground.");
}
Intent intent = new Intent(getCurrentActivity(), ScreenAudioRecorderService.class);
getCurrentActivity().bindService(intent, connection, getCurrentActivity().BIND_AUTO_CREATE);
}

@ReactMethod
public void stop(Promise promise) {
recordService.stopAudioCapture(promise);
Objects.requireNonNull(getCurrentActivity()).unbindService(connection);
}

@ReactMethod
public String ThisName(){
return "React method";
}
}



Подробнее здесь: https://stackoverflow.com/questions/792 ... ult-for-me
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»