2015-11-03 87 views
0

理想情况下,我试图在voice_trigger.xml中使用用户的语音输入并将其存储在strings.xml中,以便我可以比较相机中的字符串变量活动,如果它匹配,拍照并保存。Android Studio Google Glass:如何使用语音命令拍摄图片

我不太清楚如何实现这一点。这听起来像我有解决这个问题的正确想法吗?

下图:voice_trigger.xml,strings.xml中,CameraActivity.java

voice_trigger.xml:

<?xml version="1.0" encoding="utf-8"?> 

<!-- For more information about voice trigger, check out: https://developers.google.com/glass/develop/gdk/starting-glassware --> 
<trigger keyword="Visual tracker"> 
<!-- <input prompt="@string/glass_tracking_prompt" /> --> 
     <input interaction ="@string/take_picture"/> 
    <constraints network="true" 
     camera="true" /> 
    </trigger> 

的strings.xml:

<resources> 
    <string name="app_name">GlassTracker</string> 
    <string name="title_activity_live_card_service">Tracking Prime LiveCard</string> 
    <string name="title_activity_live_card_renderer">Tracking Prime Activity</string> 
    <string name="action_stop">Close App</string> 
    <string name="action_tune_track">Tune Tracker</string> 
    <string name="action_start_track">Start Tracking</string> 
    <string name="action_stop_track">Stop Tracking</string> 
    <string name="hello_world">Hello visual tracker!</string> 
    <string name="glass_tracking_trigger">Visual tracker</string> 
    <string name="glass_tracking_prompt">Tap to tune</string> 
    <string name="take_picture">Take a picture</string> 
</resources> 

CameraActivity.java:

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.os.FileObserver; 
import android.provider.MediaStore; 
import android.speech.RecognizerIntent; 

import com.google.android.glass.content.Intents; 

import java.io.File; 
import java.util.ArrayList; 
import java.util.List; 

/** 
* Created by 
*/ 
public class CameraActivity extends Activity { 

    private CameraSurfaceView cameraView; 


    private static final int TAKE_PICTURE_REQUEST = 1; 

    //Take the picture only if the string take_picture from voice control allows for it. 
    private void takePicture() { 

     Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
     startActivityForResult(intent, TAKE_PICTURE_REQUEST); 
    } 




    @Override 
    /*Take out ints */ 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (requestCode == TAKE_PICTURE_REQUEST && resultCode == RESULT_OK) { 
      String thumbnailPath = data.getStringExtra(Intents.EXTRA_THUMBNAIL_FILE_PATH); 
      String picturePath = data.getStringExtra(Intents.EXTRA_PICTURE_FILE_PATH); 

      processPictureWhenReady(picturePath); 
      // TODO: Show the thumbnail to the user while the full picture is being 
      // processed. 
     } 

     super.onActivityResult(requestCode, resultCode, data); 
    } 


    private void processPictureWhenReady(final String picturePath) { 
     final File pictureFile = new File(picturePath); 

     if (pictureFile.exists()) { 
      // The picture is ready; process it. 
     } else { 
      // The file does not exist yet. Before starting the file observer, you 
      // can update your UI to let the user know that the application is 
      // waiting for the picture (for example, by displaying the thumbnail 
      // image and a progress indicator). 

      final File parentDirectory = pictureFile.getParentFile(); 
      FileObserver observer = new FileObserver(parentDirectory.getPath(), 
        FileObserver.CLOSE_WRITE | FileObserver.MOVED_TO) { 
       // Protect against additional pending events after CLOSE_WRITE 
       // or MOVED_TO is handled. 
       private boolean isFileWritten; 

       @Override 
       public void onEvent(int event, String path) { 
        if (!isFileWritten) { 
         // For safety, make sure that the file that was created in 
         // the directory is actually the one that we're expecting. 
         File affectedFile = new File(parentDirectory, path); 
         isFileWritten = affectedFile.equals(pictureFile); 

         if (isFileWritten) { 
          stopWatching(); 

          // Now that the file is ready, recursively call 
          // processPictureWhenReady again (on the UI thread). 
          runOnUiThread(new Runnable() { 
           @Override 
           public void run() { 
            processPictureWhenReady(picturePath); 
           } 
          }); 
         } 
        } 
       } 
      }; 
      observer.startWatching(); 
     } 
    } 




    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     // Initiate CameraView 
     cameraView = new CameraSurfaceView(this); //Calls CameraSurfaceView 

     // Set the view 
     this.setContentView(cameraView); 


    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 

     // Do not hold the camera during onResume 
     if (cameraView != null) { 
      cameraView.releaseCamera(); 
     } 


    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 

     // Do not hold the camera during onPause 
     if (cameraView != null) { 
      cameraView.releaseCamera(); 
     } 
    } 






} 

非常感谢!

回答

0

在voice_triggers.xml文件中,将侦听语音命令。当你向设备说出你的命令时,voiceRes会填充你说的内容,因为这是一个字符串类型的数组,所以理想情况下需要将它转换为一个字符串。然后根据用户所说的做比较很简单。另外,确保在比较中包含括号,否则if语句将不起作用。这是我很快发现的解决方案,我确信有很多方法可以做到这一点。

onCreate()方法,之后this.setContentView(cameraView);

ArrayList<String> voiceRes =getIntent().getExtras().getStringArrayList(RecognizerIntent.EXTRA_RESULTS); 
String Voicedata = voiceRes.toString(); 


if(Voicedata.equals("[take a picture]") 
    { 
     takepicture(); 

    } 
+0

介意[解释您的解决方案(http://stackoverflow.com/help/how-to-answer)一点? –

+0

您应该使用编辑按钮将解释添加到您的答案中。 ;) –

相关问题