小编Don*_*rty的帖子

Android - 我可以使用MediaRecord/MediaPlayer而不是AudioRecord/Track吗?

我目前使用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)

audio android audio-recording audio-streaming media-player

5
推荐指数
1
解决办法
3372
查看次数

Android - 铃声不会停止播放

我目前在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秒)停止

java audio android ringtone

5
推荐指数
1
解决办法
5479
查看次数

Android - 如何将自己的音频编解码器添加到AudioRecord?

我目前有一个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 …

java audio android encode codec

5
推荐指数
1
解决办法
3776
查看次数

Android Socket 连接被拒绝

我正在尝试在 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)

java sockets android ip-address

5
推荐指数
1
解决办法
2万
查看次数

ContentObserver on content:// sms/in 1.6+?

我有一个内容观察者,它会调查内容:// 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)

sms android uri android-sdk-1.6 android-contentprovider

5
推荐指数
1
解决办法
4861
查看次数

Crossfilter在dc.js上显示负数,数据集中没有负数

我使用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)

javascript crossfilter dc.js

5
推荐指数
1
解决办法
1089
查看次数

Robolectric - 应用程序在设置中有单例,导致测试问题

我目前继承了一个代码覆盖率为零的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)

java android unit-testing robolectric

5
推荐指数
2
解决办法
1288
查看次数

iOS - 通话何时发出通知?

是否可以在iOS手机上进行GSM/CDMA通话时得到通知或检测?

我有一个在后台使用音频的应用程序,我希望能够检测到何时正在进行呼叫,以便我的应用程序可以做出相应的反应,以便无论如何都不会干扰蜂窝呼叫.

基本上我希望能够检测到何时正在进行呼叫,以便如果用户在通话时输入我的应用程序,我可以禁用某些功能.

所以我想知道如何检测到设备上正在进行蜂窝呼叫?

notifications objective-c ios

4
推荐指数
1
解决办法
9159
查看次数

如何在Android中使用Dagger2 Dependency Injection和Robolectric进行测试?

我最近将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)

java android unit-testing robolectric dagger-2

4
推荐指数
1
解决办法
4702
查看次数

Angular 2路线儿童出口

目前正在尝试了解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'

如果我从子路径中取出插座,我不会收到此错误消息.

任何人都可以指出我哪里错了吗?

routes angular-routing angular

4
推荐指数
1
解决办法
2036
查看次数