0

我有一个按 ID 找到的按钮 btnSpeak,然后我尝试设置 MotionEventListener 包 com.ctc.android.widget;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.Button;

import com.ctc.android.widget.ImageMap.Area;

public class ImageMapTestActivity extends Activity{

    /********** Dan's Variables     *********/
    private static final String LOG_TAG = "AudioRecordTest";
    private static String mFileName = null;

    private MediaRecorder mRecorder = null;

    private MediaPlayer mPlayer = null;
    boolean isRecording = false;
    boolean isStreaming = false;

    private String hostIP = "192.168.0.14";

    private static final int IDLE_EMPTY_BUFFER = 0;

    private static final int IDLE_BUFFER_READY = 1;

    private static final int RECORDING_STATE = 2;

    private static final int PREVIEW_STATE = 3;

    private static final int PLAYOUT_STATE = 4;

    private int currentState = IDLE_EMPTY_BUFFER;

    private static InetAddress multicastaddress = null;

    private List<String> IPs = new ArrayList<String>();
    private ArrayList<InetAddress> SelectedIPs = new ArrayList<InetAddress>();

    private boolean listUpdated = false;
    /**********     ******      *********/



    ImageMap mImageMap;
    String strCoordinates;
    int intSelectedAreaID;
    Button btnPlaySiren;
    // Button btnSpeak;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // find the image map in the view
        mImageMap = (ImageMap)findViewById(R.id.map);
        btnPlaySiren = (Button)findViewById(R.id.btnPlaySiren);
        Button btnSpeak = (Button)findViewById(R.id.btnSpeak);

        btnSpeak.setOnTouchListener(new OnTouchListener(){
            public boolean onTouch(View v, MotionEvent event){
                switch(event.getAction())
                {
                case MotionEvent.ACTION_DOWN:
                    startStreamingRun();
                    break;
                case MotionEvent.ACTION_UP:
                    stopStreamingRun();
                    break;
                }
                return true;
            }
        });

        // add a click handler to react when areas are tapped
        mImageMap.addOnImageMapClickedHandler(new ImageMap.OnImageMapClickedHandler() {
            @Override
            public void onImageMapClicked(int id) {
                // when the area is tapped, show the name in a 
                // text bubble
                intSelectedAreaID = id;
                mImageMap.showBubble(id);

                // TODO:    Change colour of selected Area.

                // TODO:    Change state of selected Area.          
            }

            @Override
            public void onBubbleClicked(int id) {
                // react to info bubble for area being tapped
            }
        });

        // TODO: Set bitmap as Area decoration for each area added.
        // TODO: Add an onClickListener for each area here.       
        ArrayList<Area> mAreas = mImageMap.GetAllAreas();
        for(Area objArea : mAreas){
            Bitmap objBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.remvox_green);
            objArea.setBitmap(objBitmap);
            Log.v("Area ID: :", Integer.toString(objArea._id)); // 07-30 14:40:05.409: V/Area ID: :(28449): 2131230738
        }   // End of for(Area...)

    }   // End of onCreate(Bundle ...)


    public void btnPlaySirenClicked(View v){
            if(v.getId() == R.id.btnPlaySiren){
                Log.v("Siren Button Clicked", "Playing siren");
                Thread thread = new Thread(new Runnable() {
                    public void run() {
                        playOverSocket();   // To resolve "Network on main thread" error!
                    }
                });
                thread.start();
        }
    }

    private void playOverSocket() {
        Log.e("AudioRecord", "Top of network play");

        /*****
        // Get the file we want to playback.    
        File file = new File("android.resource://com.ctc.android.widget.ImageMapTestActivity/res/raw/british"); // Do not add extension (file type)
        File objSirenFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/reverseme.pcm");
        // Get the length of the audio stored in the file (16 bit so 2 bytes per
        // short)
        // and create a short array to store the recorded audio.
        int musicLength = (int) (file.length() / 2);
        // short[] music = new short[musicLength];
         * *****/

        try {
            // Create a DataInputStream to read the audio data back from the
            // saved file.
            InputStream is = getResources().openRawResource(R.raw.british);
            //InputStream objSiren = new FileInputStream(file);
            BufferedInputStream bis = new BufferedInputStream(is);

            DataInputStream dis = new DataInputStream(bis);

            Socket s = null;
            try {
                s = new Socket("192.168.1.101", 6666);  // hostIP - Hard coded until implemented.
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            BufferedOutputStream buff = new BufferedOutputStream(
                    s.getOutputStream()); // out1 is the socket's outputStream

            DataOutputStream dataOutputStreamInstance = new DataOutputStream(
                    buff);
            // Read the file into the music array.
            short lastByte = dis.readShort();
            while(lastByte != -1)
            {
                dataOutputStreamInstance.writeChar(lastByte);
                lastByte = dis.readShort();
            }
            dataOutputStreamInstance.flush();
            dataOutputStreamInstance.close();
            buff.flush();
            buff.close();
            s.close();
            // Close the input streams.
            dis.close();
            } catch (Throwable t) {
                Log.e("AudioTrack", "Playback Failed" + t.getMessage());
            }
        }

    public void btnRecordClicked(View v){
        //Button btnStopRecordToggle = (Button) findViewById(R.id.btnRecord);

        if(v.getId() == R.id.btnRecord){

            Log.v("Record Button Clicked", "Recording");
            Thread thread = new Thread(new Runnable() {
                public void run() {
                    record();
                }
            });
            isRecording = true;
            thread.start();

        }
}

    private void record() {
        Log.v("AudioRecord", "Top of Record");
        int frequency = 11025;
        int channelConfiguration = AudioFormat.CHANNEL_IN_MONO;
        int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;
        File file = new File(Environment.getExternalStorageDirectory()
                .getAbsolutePath() + "/reverseme.pcm");

        // Delete any previous recording.
        if (file.exists())
            file.delete();

        // Create the new file.
        try {
            file.createNewFile();
        } catch (IOException e) {
            throw new IllegalStateException("Failed to create "
                    + file.toString());
        }

        try {
            // Create a DataOuputStream to write the audio data into the saved
            // file.
            OutputStream os = new FileOutputStream(file);
            BufferedOutputStream bos = new BufferedOutputStream(os);
            DataOutputStream dos = new DataOutputStream(bos);

            // Create a new AudioRecord object to record the audio.
            int bufferSize = 8 * 1024;// AudioRecord.getMinBufferSize(frequency,
            // channelConfiguration, audioEncoding);
            AudioRecord audioRecord = new AudioRecord(
                    MediaRecorder.AudioSource.MIC, frequency,
                    channelConfiguration, audioEncoding, bufferSize);

            short[] buffer = new short[2048];
            audioRecord.startRecording();

            while (isRecording) {
                int bufferReadResult = audioRecord.read(buffer, 0, 2048);
                for (int i = 0; i < bufferReadResult; i++)
                    dos.writeShort(buffer[i]);
            }

            audioRecord.stop();
            dos.close();
            Log.e("AudioRecord", "Recording Finished");

        } catch (Throwable t) {
            Log.e("AudioRecord", "Recording Failed");
            Log.e("AudioRecord Error", t.getLocalizedMessage());
        }
    }
    private void playRecordedOverSocket(InetAddress objAddress) {
        Log.e("AudioRecord", "Top of network play recorded");
        // Get the file we want to playback.
        File file = new File(Environment.getExternalStorageDirectory()
                .getAbsolutePath() + "/reverseme.pcm");
        // Get the length of the audio stored in the file (16 bit so 2 bytes per
        // short)
        // and create a short array to store the recorded audio.
        int musicLength = (int) (file.length() / 2);
        // short[] music = new short[musicLength];

        try {
            // Create a DataInputStream to read the audio data back from the
            // saved file.
            InputStream is = new FileInputStream(file);
            BufferedInputStream bis = new BufferedInputStream(is);

            DataInputStream dis = new DataInputStream(bis);

            Socket s = new Socket(objAddress, 6666);

            BufferedOutputStream buff = new BufferedOutputStream(
                    s.getOutputStream()); // out1 is the socket's outputStream

            DataOutputStream dataOutputStreamInstance = new DataOutputStream(
                    buff);
            // Read the file into the music array.
            for (int i = 0; i < musicLength; i++) {
                // music[i] =
                dataOutputStreamInstance.writeChar(dis.readShort());
            }
            dataOutputStreamInstance.flush();
            dataOutputStreamInstance.close();
            buff.flush();
            buff.close();
            s.close();
            // Close the input streams.
            dis.close();
        } catch (Throwable t) {
            Log.e("AudioTrack", "Playback Failed" + t.getMessage());
        }
    }
    public void btnRecordedMessageClicked(View v)
    {
        for(final InetAddress oneSpeaker : mImageMap.arrSelectedAddresses)
        {
            Thread thread = new Thread(new Runnable() {
                public void run() {
                    playRecordedOverSocket(oneSpeaker);
                }
            });
            thread.start();
        }

    }

    public void btnStopClicked(View v)
    {
        isRecording = false;
    }

    public void btnSelectAllClicked(View v)
    {
        for(Area objOneArea : mImageMap.mAreaList)
        {
            objOneArea.blnIsSelected = false;
            objOneArea.touched(SelectedIPs);
        }
        mImageMap.mBubbleMap.clear();
        mImageMap.invalidate();
    }


    public void btnCallClicked(View v)
    {

    }















    /*
     * 
     * Multi-Cast Streaming implementation
     * 
     */

    private void startStreamingRun() {
        Thread thread = new Thread(new Runnable() {
            public void run() {
                 doTestStream();
                //doMCastStream();
            }
        });
        // isStreaming = true;
        thread.start();
    }

    private void stopStreamingRun() {
        isStreaming = false;
    }

    private void doTestStream() {
        int frequency = 11025;
        int channelConfiguration = AudioFormat.CHANNEL_IN_MONO;
        int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;

        try {
            // Create a DataOuputStream to write the audio data into the saved
            // file.
            Socket s = new Socket(hostIP, 6666);

            BufferedOutputStream bos = new BufferedOutputStream(
                    s.getOutputStream()); // out1 is the socket's outputStream

            DataOutputStream dos = new DataOutputStream(bos);

            // Create a new AudioRecord object to record the audio.
            int bufferSize = 8 * 1024;// AudioRecord.getMinBufferSize(frequency,
            // channelConfiguration, audioEncoding);
            AudioRecord audioRecord = new AudioRecord(
                    MediaRecorder.AudioSource.MIC, frequency,
                    channelConfiguration, audioEncoding, bufferSize);

            //short[] buffer = new short[bufferSize];
             byte[] buffer = new byte[bufferSize];
            audioRecord.startRecording();
            byte[] MiniBuff = new byte[2];
            while (isStreaming) {
                int bufferReadResult = audioRecord.read(buffer, 0, bufferSize);

                for (int i = 0; i < bufferReadResult; i++) {

                    MiniBuff[1] = buffer[i];
                    i++;
                    MiniBuff[0] = buffer[i];
                    dos.write(MiniBuff);
                }

                /*
                for (int i = 0; i < bufferReadResult; i++) {
                    short val=(short)( ((buffer[i+1]&0xFF)<<8) | (buffer[i]&0xFF) );
                    i++;
                    dos.writeShort(val);
                }
                */
                    //dos.write(buffer[i]);
                dos.flush();
            }

            dos.flush();
            dos.close();
            s.close();
            // Close the input streams.

            audioRecord.stop();
            Log.e("AudioRecord", "Streaming Finished");

        } catch (Throwable t) {
            Log.e("AudioRecord", "Streaming Failed");
            Log.e("AudioRecord Error", t.getLocalizedMessage());
        }

    }
}   // End of class

这是在 Activity 的 onCreate 方法中完成的,但是当 Activity 运行并触摸按钮时,该事件永远不会触发,我看不出哪里出错了。不知道是不是只见树木不见木材。

4

1 回答 1

1

我已经复制了你的课程,评论了我没有关系的代码部分(所有者类,自己的文件......)。

我做了一个测试 main.xml,一切正常。您是否尝试过“Project/Clean”,也许您的 btnSpeak 中的 ID 未更新

主.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">

        <Button android:id="@+id/btnPlaySiren" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Siren" />
        <Button android:id="@+id/btnSpeak" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Speak" />
        <Button android:id="@+id/btnRecord" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Record" />
</LinearLayout>
于 2013-09-16T14:03:56.813 回答