2015-11-03 3 views
0

В идеале я пытаюсь использовать голосовые сообщения от пользователя в voice_trigger.xml и хранить его в файле strings.xml, чтобы я мог сравнивать строковую переменную в Camera чтобы он соответствовал, сделайте снимок и сохраните его.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

Вы должны добавить объяснение к своему ответу, используя кнопку редактирования. ;) –

Смежные вопросы