Zastanawiasz się, czy ktoś może mi pomóc w wątkach w tle na Androida.Android - jak poprawnie wkręcać tło?
Mam kawałek kodu, który nagrywa z mikrofonu urządzenia, a następnie odtwarza to, co nagrywa przez słuchawkę (w 1.5).
Próbuję uruchomić go w wątku, ale nie udało się go uruchomić jako wątek w tle.
Obecnie działa i blokuje działanie, aby wszystko się stało, wątek jest uruchomiony, a interfejs jest zablokowany lub wydaje się, że zwisa.
Oto Ostatnia droga Próbowałem to zrobić:
public class LoopProg extends Activity {
boolean isRecording; //currently not used
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
AudioManager audio_service = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
audio_service.setSpeakerphoneOn(false);
audio_service.setMode(AudioManager.MODE_IN_CALL);
audio_service.setRouting(AudioManager.MODE_NORMAL,
AudioManager.ROUTE_EARPIECE, AudioManager.ROUTE_ALL);
Record record = new Record();
record.run();
}
public class Record extends Thread
{
static final int bufferSize = 200000;
final short[] buffer = new short[bufferSize];
short[] readBuffer = new short[bufferSize];
public void run() {
isRecording = true;
android.os.Process.setThreadPriority
(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);
int buffersize = AudioRecord.getMinBufferSize(11025,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT);
AudioRecord arec = new AudioRecord(MediaRecorder.AudioSource.MIC,
11025,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT,
buffersize);
AudioTrack atrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL,
11025,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT,
buffersize,
AudioTrack.MODE_STREAM);
setVolumeControlStream(AudioManager.STREAM_VOICE_CALL);
atrack.setPlaybackRate(11025);
byte[] buffer = new byte[buffersize];
arec.startRecording();
atrack.play();
while(isRecording) {
arec.read(buffer, 0, buffersize);
atrack.write(buffer, 0, buffer.length);
}
arec.stop();
atrack.stop();
isRecording = false;
}
}
}
Zastanawiałem się, czy ktoś mógłby poprowadzić mnie, w jaki sposób przekształcić to wątek tła? A może wskaż mi jakiś samouczek, który może być istotny, który mogłem pominąć?
góry dzięki
Dzięki, to posortowane. Ale czy jest to właściwy sposób uruchomienia go jako wątku backgrond lub wątku roboczego? –
To jeden sposób, aby to zrobić. Możesz to zrobić w Javie, implementując wątek lub Runnable, lub możesz to zrobić w Androidzie, implementując AsyncTask. Osobiście używam AsyncTask do wszystkich wątków w tle, które implementuję w moich aplikacjach. –
Dzięki mBaird, zajrzysz do AsyncTask –