Что мне добавить в код, чтобы использовать мой голос в приложении камеры? У меня есть голос? - PullRequest
0 голосов
/ 21 ноября 2011

Я прогрессировал в своей программе, я пытаюсь использовать команду моего голоса, чтобы сделать снимок с помощью камеры. Исходя из того, что я просто смотрю на то, что у меня есть, вы случайно не знаете, что мне еще нужно?

 package com.example;

 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.IOException;

 import android.app.Activity;
 import android.hardware.Camera;
 import android.hardware.Camera.PictureCallback;
 import android.hardware.Camera.ShutterCallback;
 import android.os.Bundle;
 import android.util.Log;
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.widget.Button;
 import android.widget.FrameLayout;
 import android.speech.*;


public class CameraDemo extends Activity {
private static final String TAG = "CameraDemo";
Camera camera;
Preview preview;
Button buttonClick;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    preview = new Preview(this);
    ((FrameLayout) findViewById(R.id.preview)).addView(preview);

    buttonClick = (Button) findViewById(R.id.buttonClick);
    buttonClick.setOnClickListener( new OnClickListener() 
    {
        public void onClick(View v) 
        {
                preview.camera.takePicture(shutterCallback, rawCallback, jpegCallback);
        }
    });

    Log.d(TAG, "onCreate'd");
}


ShutterCallback shutterCallback = new ShutterCallback() 
{
    public void onShutter() 
    {
        Log.d(TAG, "onShutter'd");
    }
};

/** Handles data for raw picture */
PictureCallback rawCallback = new PictureCallback() 
{
    public void onPictureTaken(byte[] data, Camera camera) 
    {
        Log.d(TAG, "onPictureTaken - raw");
    }
};
/** Handles data for jpeg picture */
PictureCallback jpegCallback = new PictureCallback() 
{
    public void onPictureTaken(byte[] data, Camera camera) 
    {
        FileOutputStream outStream = null;
        try 
        {
                // write to local sandbox file system
 //         
            outStream = CameraDemo.this.openFileOutput      (String.format      ("%     d.jpg", System.currentTimeMillis()), 0);    
            // Or write to sdcard
            outStream = new FileOutputStream(String.format("/sdcard/%d.jpg", System.currentTimeMillis()));  
            outStream.write(data);
            outStream.close();
            Log.d(TAG, "onPictureTaken - wrote bytes: " + data.length);
        } 
        catch (FileNotFoundException e) 
        {
            e.printStackTrace();
        } 
        catch (IOException e) 
        {
            e.printStackTrace();
        } 
        finally 
        {
        }
        Log.d(TAG, "onPictureTaken - jpeg");
    }

    @Override 
    protected void 
            onActivityResult(int requestCode, int resultCode, Intent data) 
    { 
        if (requestCode == VOICE_RECOGNITION_REQUEST_CODE) 
        { 
            if (resultCode == RESULT_OK) 
            { 
                List<String> heard = 
                        data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS); 
                for (int i = 0; i < heard.size(); i++) 
                { 
                    Log.d(TAG, i + ": " + heard.get(i)); 
                } 
                receiveWhatWasHeard(heard); 
            } 
            else 
            { 
//fail 
            } 
        } 
        super.onActivityResult(requestCode, resultCode, data); 
    } 
};

protected void receiveWhatWasHeard(List<String> heard) 
{ 
    WordDictionary command = new WordDictionary("Add"); 
    for (String said : heard) 
    { 
        if (command.isIn(said.split("\\s"))) 
        { 
            Log.d(TAG, "heard add"); 
        } 
    } 
} 


public class WordDictionary 
{ 
    private Set<String> words; 

    public WordDictionary(String... wordsIn) 
    { 
        this(Arrays.asList(wordsIn)); 
    } 

    public WordDictionary(List<String> wordsIn) 
    { 
        words = new LinkedHashSet<String>(wordsIn); 
    } 

    public Set<String> getWords() 
    { 
        return words; 
    } 

    public boolean isIn(String word) 
    { 
        return words.contains(word); 
    } 

    public boolean isIn(String [] wordsIn) 
    { 
        boolean wordIn = false; 
        for (String word : wordsIn) 
        { 
            if (isIn(word)) 
            { 
                wordIn = true; 
                break; 
            } 
        } 
        return wordIn; 
        }
}

preview.java

package com.example;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.hardware.Camera;
import android.hardware.Camera.PreviewCallback;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;


class Preview extends SurfaceView implements SurfaceHolder.Callback {
 private static final String TAG = "Preview";

SurfaceHolder mHolder;
public Camera camera;

Preview(Context context) {
    super(context);

    // Install a SurfaceHolder.Callback so we get notified when the
    // underlying surface is created and destroyed.
    mHolder = getHolder();
    mHolder.addCallback(this);
    mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}

public void surfaceCreated(SurfaceHolder holder) {
    // The Surface has been created, acquire the camera and tell it where
    // to draw.
    camera = Camera.open();
    try {
        camera.setPreviewDisplay(holder);


        camera.setPreviewCallback(new PreviewCallback() {

            public void onPreviewFrame(byte[] data, Camera arg1) {
                FileOutputStream outStream = null;
                try {
                    outStream = new FileOutputStream(String.format("/sdcard/%d.jpg", System.currentTimeMillis()));  
                    outStream.write(data);
                    outStream.close();
                    Log.d(TAG, "onPreviewFrame - wrote bytes: " + data.length);
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                }
                    Preview.this.invalidate();
            }
        });
    } catch (IOException e) {
        e.printStackTrace();
    }
}

public void surfaceDestroyed(SurfaceHolder holder) {
    // Surface will be destroyed when we return, so stop the preview.
    // Because the CameraDevice object is not a shared resource, it's very
    // important to release it when the activity is paused.
    camera.stopPreview();
    camera = null;
}

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
    // Now that the size is known, set up the camera parameters and begin
    // the preview.
    Camera.Parameters parameters = camera.getParameters();
    parameters.setPreviewSize(w, h);
    camera.setParameters(parameters);
    camera.startPreview();
}

@Override
public void draw(Canvas canvas) {
        super.draw(canvas);
        Paint p= new Paint(Color.RED);
        Log.d(TAG,"draw");
        canvas.drawText("PREVIEW", canvas.getWidth()/2, canvas.getHeight()/2, p );
}
}
main.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" android:id="@+id/layout">
<TextView android:layout_width="fill_parent"
    android:layout_height="wrap_content" android:text="VoCam"
    android:textSize="24sp" />

<FrameLayout android:id="@+id/preview"
    android:layout_weight="1" android:layout_width="fill_parent"
    android:layout_height="fill_parent">
</FrameLayout>

<Button android:layout_width="wrap_content"
    android:layout_height="wrap_content" android:id="@+id/buttonClick"
    android:text="Listening" android:layout_gravity="center"></Button>

</LinearLayout>

manifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example" android:versionCode="1" android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
    <activity android:name=".CameraDemo" android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

</application>
<uses-sdk android:minSdkVersion="7" />

<uses-permission android:name="android.permission.CAMERA" />
</manifest> 

1 Ответ

0 голосов
/ 21 ноября 2011

Я предлагаю вам взглянуть на API речевого ввода Android , этого должно быть достаточно, чтобы вы начали

...