如何使用 Codename One 测试 Android 本机代码片段?
How to test an Android native code snippet with Codename One?
首先,我习惯于使用 Java 进行编程,这就是我使用代号 One 开发移动应用程序的原因。
但是有时我会在 Android "format" 中看到一些我感兴趣的代码来测试。感谢 Codename one tutorial,我知道如何设置基本的本机界面。
例如,我想测试这个 snippet about real time sound processing. However it involves initializing some variable in the Android onCreate()
method with data that is available in this method such as am = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE);
with the use of this
which has not the same reference in the Codename One Native Interface. Maybe I don't have to use the onCreate()
method (which could be reached from Codename One) 但我不是 Android 大师(也不是 CN1 大师!),所以我不知道。
因此,我必须进行哪些更改才能在 Codename One 本机界面中测试本机 Android 代码?也许有一种方法我会很高兴听到。
编辑已解决:本机接口实现中使用的代码有效
这里是 original Android code 的 Codename One 本机接口实现。 Android onCreate()
方法确实没有被使用,但是其中初始化的东西已经转移到 initRecordAndTrack()
方法中,该方法在适合代号一的形式时被调用。它使用与@akash 下文所述相同的方法,因此将 this
替换为 com.codename1.impl.android.AndroidNativeUtil.getActivity()
。
import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioRecord;
import android.media.AudioTrack;
import android.media.MediaRecorder;
import android.media.MediaPlayer;
import android.content.Context;
public class KestudisNativeInterfaceImpl {
boolean isRecording = false;
AudioManager am = null;
AudioRecord record = null;
AudioTrack track = null;
public void initRecordAndTrack() {
android.app.Activity ctx = com.codename1.impl.android.AndroidNativeUtil.getActivity();
am = (AudioManager) ctx.getSystemService(Context.AUDIO_SERVICE);
am.setSpeakerphoneOn(true);
int min = AudioRecord.getMinBufferSize(8000, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);
record = new AudioRecord(MediaRecorder.AudioSource.VOICE_COMMUNICATION, 8000, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT,
min);
// if (AcousticEchoCanceler.isAvailable())
// {
// AcousticEchoCanceler echoCancler = AcousticEchoCanceler.create(record.getAudioSessionId());
// echoCancler.setEnabled(true);
// }
int maxJitter = AudioTrack.getMinBufferSize(8000, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT);
track = new AudioTrack(AudioManager.MODE_IN_COMMUNICATION, 8000, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, maxJitter,
AudioTrack.MODE_STREAM);
(new Thread() {
@Override
public void run() {
recordAndPlay();
}
}).start();
}
public void startRecordAndPlay() {
record.startRecording();
track.play();
isRecording = true;
}
public void stopRecordAndPlay() {
record.stop();
track.pause();
isRecording = false;
}
private void recordAndPlay() {
short[] lin = new short[1024];
int num = 0;
am.setMode(AudioManager.MODE_IN_COMMUNICATION);
while (true) {
if (isRecording) {
num = record.read(lin, 0, 1024);
track.write(lin, 0, num);
}
}
}
public boolean isSupported() {
return true;
}
}
非常感谢,
干杯
在android中this
通常指的是上下文,要访问CN1中的上下文,您可以将this
替换为com.codename1.impl.android.AndroidNativeUtil.getActivity()
希望对您有所帮助
首先,我习惯于使用 Java 进行编程,这就是我使用代号 One 开发移动应用程序的原因。
但是有时我会在 Android "format" 中看到一些我感兴趣的代码来测试。感谢 Codename one tutorial,我知道如何设置基本的本机界面。
例如,我想测试这个 snippet about real time sound processing. However it involves initializing some variable in the Android onCreate()
method with data that is available in this method such as am = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE);
with the use of this
which has not the same reference in the Codename One Native Interface. Maybe I don't have to use the onCreate()
method (which could be reached from Codename One) 但我不是 Android 大师(也不是 CN1 大师!),所以我不知道。
因此,我必须进行哪些更改才能在 Codename One 本机界面中测试本机 Android 代码?也许有一种方法我会很高兴听到。
编辑已解决:本机接口实现中使用的代码有效
这里是 original Android code 的 Codename One 本机接口实现。 Android onCreate()
方法确实没有被使用,但是其中初始化的东西已经转移到 initRecordAndTrack()
方法中,该方法在适合代号一的形式时被调用。它使用与@akash 下文所述相同的方法,因此将 this
替换为 com.codename1.impl.android.AndroidNativeUtil.getActivity()
。
import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioRecord;
import android.media.AudioTrack;
import android.media.MediaRecorder;
import android.media.MediaPlayer;
import android.content.Context;
public class KestudisNativeInterfaceImpl {
boolean isRecording = false;
AudioManager am = null;
AudioRecord record = null;
AudioTrack track = null;
public void initRecordAndTrack() {
android.app.Activity ctx = com.codename1.impl.android.AndroidNativeUtil.getActivity();
am = (AudioManager) ctx.getSystemService(Context.AUDIO_SERVICE);
am.setSpeakerphoneOn(true);
int min = AudioRecord.getMinBufferSize(8000, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);
record = new AudioRecord(MediaRecorder.AudioSource.VOICE_COMMUNICATION, 8000, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT,
min);
// if (AcousticEchoCanceler.isAvailable())
// {
// AcousticEchoCanceler echoCancler = AcousticEchoCanceler.create(record.getAudioSessionId());
// echoCancler.setEnabled(true);
// }
int maxJitter = AudioTrack.getMinBufferSize(8000, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT);
track = new AudioTrack(AudioManager.MODE_IN_COMMUNICATION, 8000, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, maxJitter,
AudioTrack.MODE_STREAM);
(new Thread() {
@Override
public void run() {
recordAndPlay();
}
}).start();
}
public void startRecordAndPlay() {
record.startRecording();
track.play();
isRecording = true;
}
public void stopRecordAndPlay() {
record.stop();
track.pause();
isRecording = false;
}
private void recordAndPlay() {
short[] lin = new short[1024];
int num = 0;
am.setMode(AudioManager.MODE_IN_COMMUNICATION);
while (true) {
if (isRecording) {
num = record.read(lin, 0, 1024);
track.write(lin, 0, num);
}
}
}
public boolean isSupported() {
return true;
}
}
非常感谢,
干杯
在android中this
通常指的是上下文,要访问CN1中的上下文,您可以将this
替换为com.codename1.impl.android.AndroidNativeUtil.getActivity()
希望对您有所帮助