zoukankan      html  css  js  c++  java
  • LuajavaBridge 声音捕捉

    首先通过luajavabridge,从Lua的代码中切换到Android下面,调用Android的声音捕捉相关代码,然后android端将是否成功捕捉到一定大小的声音结果返回给Lua。

    Lua端的相关调用操作:

     1 local aboutBtn = ui.newImageMenuItem({
     2         image = aboutImgPath,
     3         imageSelected = aboutImgSelectedPath,
     4         x = CommonAPI:getFixedX(180) -CommonAPI:getCenterX(),
     5         y = CommonAPI:getFixedY(80) -CommonAPI:getCenterY(),
     6         listener = function()  
     7              -- call Java method
     8             local javaClassName = "com.quick_x.sample.luajavabridge.Luajavabridge"
     9             local javaMethodName = "catchVoice"
    10             local javaParams = {
    11                 device.cachePath,
    12                 "I'm great !",
    13                 function(event)
    14                     printf("Java method callback value is [%s]", event)
    15                     textInput:setText(string.format("%s", event))
    16                 end
    17             }
    18             local javaMethodSig = "(Ljava/lang/String;Ljava/lang/String;I)V"
    19             luaj.callStaticMethod(javaClassName, javaMethodName, javaParams, javaMethodSig)
    20         end
    21     })

    Android下面的操作:(    使用MediaRecorder来记录声音,注意这里的线程切换跟官方给的方式不一样,不过是可行的。
        开启一个独立的线程CheckMicophoneVolume,用来监听外界声音的大小,达到一定分贝,触发函数,返回给Lua结果。
        使用完MediaRecoder以后,记得stop(),然后释放它。不然第二次通过Lua来调用的时候会报错、)

    ----------------------------------------------------

    注意我这里的cachePath是通过Lua传过来的。
    cachePath的值是大概这样的:/data/data/项目包名/files/
    我的就是:/data/data/com.quick_x.sample.luajavabridge/files/

    ---------------------------------------------------------------

     1 public class Luajavabridge extends Cocos2dxActivity {
     2     static private Luajavabridge s_instance;
     3 
     4     static int callbackFunction;
     5     static MediaRecorder mRecorder;
     6 
     7     @Override
     8     public void onCreate(Bundle savedInstanceState) {
     9         super.onCreate(savedInstanceState);
    10         s_instance = this;
    11     }
    12 
    13     static {
    14         System.loadLibrary("game");
    15     }
    16 
    17     public static void catchVoice(final String cachePath, final String message,
    18             final int luaCallbackFunction) {
    19         callbackFunction = luaCallbackFunction;
    20 
    21         s_instance.runOnUiThread(new Runnable() {
    22             @Override
    23             public void run() {
    24                 try {
    25                     File soundFile = new File(cachePath+"audio.3gp");
    26                     
    27                     if(mRecorder == null){
    28                         mRecorder = new MediaRecorder();
    29                         mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    30                         mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
    31                         mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
    32                         mRecorder.setOutputFile(soundFile.getAbsolutePath());
    33                     }
    34                     mRecorder.prepare();
    35                     mRecorder.start();
    36                 } catch (IOException e) {
    37                     e.printStackTrace();
    38                 }
    39 
    40                 CheckMicophoneVolume thread = new CheckMicophoneVolume();
    41                 thread.start();
    42             }
    43         });
    44     }
    45 
    46     public static void catchVoiceSuccess() {
    47         mRecorder.stop();
    48         mRecorder = null;
    49         s_instance.runOnGLThread(new Runnable() {
    50             @Override
    51             public void run() {
    52                 Cocos2dxLuaJavaBridge.callLuaFunctionWithString(
    53                         callbackFunction, "声音捕捉成功");
    54                 Cocos2dxLuaJavaBridge.releaseLuaFunction(callbackFunction);
    55             }
    56         });
    57     }
    58 
    59     private static class CheckMicophoneVolume extends Thread {
    60         private volatile boolean running = true;
    61 
    62         public void exit() {
    63             running = false;
    64         }
    65 
    66         @Override
    67         public void run() {    
    68             while (running) {
    69                 try {
    70                     Thread.sleep(200);
    71                 } catch (InterruptedException e) {
    72                     e.printStackTrace();
    73                 }
    74             
    75                 if (mRecorder == null || !running) {
    76                     break;
    77                 }
    78         
    79                 int x = mRecorder.getMaxAmplitude();
    80                 Log.v("X_value", ""+x);
    81                 if (x != 0) {
    82                     int f = (int) (10 * Math.log(x) / Math.log(10));
    83                     Log.v("value", ""+f);
    84                     if (f > 40) {
    85                         catchVoiceSuccess();
    86                         exit();
    87                     }
    88                 }
    89             }
    90         }
    91     }
    92 }

    注意添加权限文件:

        <uses-permission android:name="android.permission.RECORD_AUDIO"/>
        <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>  
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

  • 相关阅读:
    操作系统进程
    Lowest Common Ancestor of a Binary Search Tree
    Java并发编程实践之对象的组合
    字典序排序-求全排列(元素有重复)
    计算机网络基础知识
    多线程的基础知识
    多线程编程题
    Flask安装
    appium使用实例
    调用Excel或Oracle数据,数据加载,selenium等使用实例
  • 原文地址:https://www.cnblogs.com/vokie/p/3613698.html
Copyright © 2011-2022 走看看