首先,我习惯用Java编程,这就是我使用Codename One开发移动应用程序的原因。
但有时我会看到一些Android格式的代码,我对测试感兴趣。由于Codename one tutorial,我知道如何设置基本的本机界面。
例如,我想测试一下snippet about real time sound processing。但是,它涉及使用此方法中可用的数据(例如onCreate()
使用am = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE);
初始化Android this
方法中的某些变量,而onCreate()
在Codename One Native中具有相同的引用接口。也许我不必使用onCreate()
方法(可以be reached from Codename One),但我不是Android大师(也不是CN1)!所以我不知道。
因此,在Codename One原生界面中测试原生Android代码需要做些哪些更改?也许我会很高兴听到一种方法论。
EDIT已解决:本机接口实现中使用的代码
这是original Android code的Codename One本地接口实现。事实上,Android initRecordAndTrack()
方法尚未被使用,但在其中初始化的内容已经在this
方法中转移,该方法在适合于Codename One的形式时被调用。它使用@akash所述的相同方法,从而将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;
}
。
System.out.println(count(s, ch));
}
非常感谢,
干杯
答案 0 :(得分:1)
在android this
中,通常会引用上下文并访问CN1中的上下文,您可以将this
替换为com.codename1.impl.android.AndroidNativeUtil.getActivity()
希望有所帮助