我目前使用AudioRecord从Android设备的麦克风录制音频,然后将其直接传送到播放Android设备耳机的AudioTrack.
我想知道我可以做同样的事情,但使用MediaPlayer和MediaRecorder类,因为我需要使用Media类上可用的AMR-NB编码,而不是Audio类.
我的MediaRecorder和MediaPlayer的问题是,我似乎必须录制到一个文件,然后播放该文件?
这不是我想要做的,无论如何将音频声音从Mic转换为带有Media类的Earpiece?
我使用Audio类的代码如下,是否可以使用MediaPlayer和MediaRecorder执行相同的操作?
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);
arec = new AudioRecord(MediaRecorder.AudioSource.MIC,
11025,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
MediaRecorder.AudioEncoder.AMR_NB,
buffersize);
atrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL,
11025,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
MediaRecorder.AudioEncoder.AMR_NB,
buffersize,
AudioTrack.MODE_STREAM);
Log.d("AUDIO", "sample rate = : " + arec.getSampleRate());
atrack.setPlaybackRate(11025);
byte[] buffer = new byte[buffersize];
arec.startRecording();
atrack.play();
while(isRecording) {
arec.read(buffer, 0, …Run Code Online (Sandbox Code Playgroud) 我目前在Android上启动铃声,它播放正常.
然而,当我试图停止铃声时它不会停止或至少不会立即停止,它会一直播放直到它刚播放出来.
以下是我设置铃声的方法:
int rm = audio_service.getRingerMode();
int vs = audio_service.getVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER);
android.os.Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
if ((rm == AudioManager.RINGER_MODE_VIBRATE ||
(rm == AudioManager.RINGER_MODE_NORMAL && vs == AudioManager.VIBRATE_SETTING_ON)))
v.vibrate(vibratePattern,1);
if (audio_service.getStreamVolume(AudioManager.STREAM_RING) > 0) {
oRingtone = RingtoneManager.getRingtone(this, Settings.System.DEFAULT_RINGTONE_URI);
oRingtone.setStreamType(AudioManager.STREAM_RING);
oRingtone.play();
}
Run Code Online (Sandbox Code Playgroud)
以下是我试图阻止它的方法
if (CallDialogActivity.oRingtone != null) {
Log.d("RINGTONE", "Into Ringtone if");
Ringtone ringtone = CallDialogActivity.oRingtone;
oRingtone = null;
ringtone.stop();
}
Run Code Online (Sandbox Code Playgroud)
有没有人遇到过类似的问题或者我的代码中有任何错误?
编辑:
只是要添加我已经添加了日志记录,以便在我调用ringtone.stop()之后看看ringtone.isPlaying()是否返回true或false并且它返回false,但是之前的音调持续播放几秒钟(3 - 5秒)停止
我目前有一个Loop back程序,用于测试Android设备上的音频.
它使用AudioRecord和AudioTrack记录来自Mic的PCM音频,并将PCM音频播放到耳机中.
这是代码:
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);
arec = new AudioRecord(MediaRecorder.AudioSource.MIC,
11025,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT,
buffersize);
atrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL,
11025,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT,
buffersize,
AudioTrack.MODE_STREAM);
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
因此,您可以在创建AudioTrack和AudioRecord时看到编码是通过AudioFormat提供的,但这只允许16位或8位PCM.
我现在有自己的G711 …
我正在尝试在 Android 上打开一个 Socket,但每次尝试时,无论我尝试哪种方式,我都会不断收到连接被拒绝的错误。
错误发生在我尝试创建连接的以下代码行中。
Socket socket = new Socket(getLocalIpAddressString(), 8008);
Run Code Online (Sandbox Code Playgroud)
下面是我用来获取本地ip地址的方法:
public static String getLocalIpAddressString() {
try {
for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
NetworkInterface intf = en.nextElement();
for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
InetAddress inetAddress = enumIpAddr.nextElement();
if (!inetAddress.isLoopbackAddress()) {
return inetAddress.getHostAddress().toString();
}
}
}
} catch (SocketException ex) {
Log.e("IPADDRESS", ex.toString());
}
return null;
Run Code Online (Sandbox Code Playgroud)
}
我得到的错误是:
WARN/System.err(3574): java.net.ConnectException: /192.168.2.163:8008 - Connection refused
WARN/System.err(3574): at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:237)
WARN/System.err(3574): at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:199)
WARN/System.err(3574): at java.net.Socket.startupSocket(Socket.java:734)
WARN/System.err(3574): at java.net.Socket.<init>(Socket.java:157)
WARN/System.err(3574): …Run Code Online (Sandbox Code Playgroud) 我有一个内容观察者,它会调查内容:// sms /在android 1.5中,以便我收到有关sms数据库更改的通知,并可以相应地对它们作出反应.
但是在1.6中这不起作用,uri是否已从content:// sms /更改为其他内容?
我已经看到内容:// mms-sms /在我的1.6设备上的logcat中弹出但是我已经尝试了它并且它不起作用.
这是我的代码
String url = "content://sms/";
Uri uri = Uri.parse(url);
getContentResolver().registerContentObserver(uri, true, new MyContentObserver(handler));
}
class MyContentObserver extends ContentObserver {
public MyContentObserver(Handler handler) {
super(handler);
}
@Override public boolean deliverSelfNotifications() {
return false;
}
ContentValues values = new ContentValues();
@Override public void onChange(boolean arg0) {
super.onChange(arg0);
Log.v("SMS", "Notification on SMS observer");
values.put("status", 5);
Message msg = new Message();
msg.obj = "xxxxxxxxxx";
int threadId = 0;
handler.sendMessage(msg);
Uri uriSMSURI = Uri.parse("content://sms/");
Cursor …Run Code Online (Sandbox Code Playgroud) 我使用CrossFilter和dc.js来创建4个不同的条形图,并允许用户使用图表上的画笔功能更改数据,因此当用户在一个图表上更改画笔时,其他图表会动态更改.
这一切都在我的分钟栏上工作一个有趣的问题,看起来像CrossFilter或dc.js在图表上放置负值但仅在选择图表的某些部分时.
因此,当我选择图表中似乎没有值的区域时,从图像中可以看到,这会在其他图表中显示负值.

我的数据中有四个项目,日期,类型(字符串),值(数字)和分组值(这是分组为较小块值50的值)
然后我在每个数据和4个组上有4个维度,这些维度提供给图表.
我的数据中从不存在任何负值,因此我的图表如何显示负值?
我是CrossFilter和dc.js的新手,所以我不确定最好的方法或最好的代码片段在这里展示,如果还有别的东西我应该分享请告诉我,我真的需要帮助试图理解为什么我的图表中有负数.
编辑:添加代码
以下是我的数据示例:
[{"Id":"1","InDate":"2015年10月31日","类型":"新","类别":"cat1","值":"1.400874145"},{"我":" 2" , "铟酸": "21/10/2014", "类型": "老", "类别": "CAT2", "值": "0"}]
我使用CSV文件中的d3.csv函数读取它.我在CSV文件中检查了三个负值.
以下是我设置尺寸的方法:
var ndx = crossfilter(data);
var parseDate = d3.time.format("%d/%m/%Y").parse;
data.forEach(function(d) {
d.date = parseDate(d.InDate);
d.valueGrouped = createValueGrouping(parseFloat(d.Value));
});
var dateDim = ndx.dimension(function(d) {return d.date;});
var typeDim = ndx.dimension(function(d) {return d.Type;});
var valueGroupDim = ndx.dimension(function(d) {return d.valueGrouped;});
var categoryDim = ndx.dimension(function(d) {return d.Category;});
Run Code Online (Sandbox Code Playgroud)
这是创建valueGrouped属性的函数:
function createValueGrouping(value){
return 50 * Math.round(value/50);
}
Run Code Online (Sandbox Code Playgroud)
最后,我将如何设置组:
var timelineGroup = dateDim.group().reduceSum(function(d) {return parseFloat(d.Value);});
var typeGroup …Run Code Online (Sandbox Code Playgroud) 我目前继承了一个代码覆盖率为零的Android应用程序,我的第一个工作就是为它编写一些单元测试.所以我决定也把它作为学习Robolectric的机会.
但是我遇到了初始问题,需要运行两个简单的虚拟测试.
这是我的测试文件中的代码:
@Config(constants = BuildConfig.class)
@RunWith(RobolectricGradleTestRunner.class)
public class SplashActivityTest {
private SplashActivity activity;
// @Before => JUnit 4 annotation that specifies this method should run before each test is run
// Useful to do setup for objects that are needed in the test
@Before
public void setup() {
// Convenience method to run SplashActivity through the Activity Lifecycle methods:
// onCreate(...) => onStart() => onPostCreate(...) => onResume()
activity = Robolectric.setupActivity(SplashActivity.class);
}
// @Test => JUnit 4 annotation specifying this …Run Code Online (Sandbox Code Playgroud) 是否可以在iOS手机上进行GSM/CDMA通话时得到通知或检测?
我有一个在后台使用音频的应用程序,我希望能够检测到何时正在进行呼叫,以便我的应用程序可以做出相应的反应,以便无论如何都不会干扰蜂窝呼叫.
基本上我希望能够检测到何时正在进行呼叫,以便如果用户在通话时输入我的应用程序,我可以禁用某些功能.
所以我想知道如何检测到设备上正在进行蜂窝呼叫?
我最近将Dagger2应用到Android应用程序中以便于依赖注入,但在这样做后,我的一些测试已停止工作.
现在我想了解如何调整我的测试以使用Dagger2?我正在使用Robolectric来运行我的测试.
以下是我如何使用Dagger2,我最近才学会它,所以这可能是不好的做法,并没有帮助测试,所以请指出我可以做的任何改进.
我有一个AppModule,如下所示:
@Module
public class MyAppModule {
//Application reference
Application mApplication;
//Set the application value
public MyAppModule(Application application) {
mApplication = application;
}
//Provide a singleton for injection
@Provides
@Singleton
Application providesApplication() {
return mApplication;
}
}
Run Code Online (Sandbox Code Playgroud)
我称之为NetworkModule,提供注入对象,如下所示:
@Module
public class NetworkModule {
private Context mContext;
//Constructor that takes in the required context and shared preferences objects
public NetworkModule(Context context){
mContext = context;
}
@Provides
@Singleton
SharedPreferences provideSharedPreferences(){
//...
}
@Provides @Singleton
OkHttpClient provideOKHttpClient(){
//...
}
@Provides @Singleton …Run Code Online (Sandbox Code Playgroud) 目前正在尝试了解Angular 2路由,并且我遇到了一个我无法解决的问题,感觉它是某种语法或配置,我只是缺少.
我希望在一个页面上有两个路由器插座,并且能够在页面上显示两个单独的部分,用户可以单独导航.
我试着按照这里的代码 - http://onehungrymind.com/named-router-outlets-in-angular-2/
但是,当我这样做时,我收到一个错误,说它无法找到子路由所在的路由.
这是代码:
路线
{
path: 'full',
component: FullComponent,
children: [
{
path: 'list',
component: ListComponent,
outlet: 'list'
}
]
}
Run Code Online (Sandbox Code Playgroud)
在完整组件中:
<div divOne>
<router-outlet name="list"></router-outlet>
</div>
<div divTwo>
<router-outlet name="detail"></router-outlet>
</div>
Run Code Online (Sandbox Code Playgroud)
我这样导航:
let navigationExtras: any = {
queryParams: { reference: 21 },
outlets: {'list': ['list']}
};
this.router.navigate( ['full'], navigationExtras);
Run Code Online (Sandbox Code Playgroud)
这给我以下错误信息:
core.umd.js:5995 EXCEPTION:未捕获(承诺):错误:无法匹配任何路线:'full'
如果我从子路径中取出插座,我不会收到此错误消息.
任何人都可以指出我哪里错了吗?
android ×7
java ×5
audio ×3
robolectric ×2
unit-testing ×2
angular ×1
codec ×1
crossfilter ×1
dagger-2 ×1
dc.js ×1
encode ×1
ios ×1
ip-address ×1
javascript ×1
media-player ×1
objective-c ×1
ringtone ×1
routes ×1
sms ×1
sockets ×1
uri ×1