рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдореИрдВрдиреЗ (рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рдкреНрд░рдмрд▓рд┐рдд) рдЦреЛрдЬрдХрд░реНрддрд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рддрд╣рдд Google рдЧреНрд▓рд╛рд╕ рдЦрд░реАрджрдиреЗ рдХрд╛ рдореМрдХрд╛ рджрд┐рдпрд╛ рдерд╛ред рдПрдХ рдХреЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдСрд░реНрдбрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдерд╛, рдЕрдЧрд▓реА рд╕реБрдмрд╣ рдкреЛрд╕реНрдЯрдореИрди рдиреЗ рдореБрдЭреЗ рдЕрдкрдиреЗ рдЬреАрдЬрд╛рдЬреА рдХреЗ рдкрд╛рд╕ рджрд╕реНрддрдХ рджреА - рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдкреИрдХреЗрдЬ рд╣реИред рдЕрдкрдиреЗ рджрд╛рдВрддреЛрдВ рдХреЛ рдзреЛрдП рдФрд░ рдмреНрд░рд╢ рдХрд┐рдП рдмрд┐рдирд╛ ...
рд╢рд╛рдо рдХреЛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рдорд┐рд▓рд╛ред рдХреБрдЫ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдФрд░ рдкрд░реНрдпрд╛рд╡рд░рдг рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж - рдореИрдВ рд╡реНрдпрд╡рд╕рд╛рдп рдореЗрдВ рдЙрддрд░ рдЧрдпрд╛ред рдПрдХ рдЖрд╡реЗрджрди рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдЪрд╛рд░ рдерд╛ рдЬреЛ рдПрдХ рд╡реЗрдм рд╕реЗрд╡рд╛, рдЪрдХ рдЬреЗрдиреНрд╕рди рд╕реЗ рдЪрдХ рдиреЙрд░рд┐рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдордЬрд╝рд╛рдХ рдЙрдбрд╝рд╛рдПрдЧрд╛, рдФрд░ рдЬреЛрд░ рд╕реЗ рдкрдврд╝реЗрдЧрд╛ред
рддреЛ рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред
рдЖрд╡рд╛рдЬ рд╕рдХреНрд░рд┐рдпрдг:
рд╡реЙрдЗрд╕ рдХрдорд╛рдВрдб рд╕реЗ рд╣рдорд╛рд░рд╛ рдордЬрд╛рдХ рд╕рдХреНрд░рд┐рдп рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░рдХрдЯ рдореЗрдВ рд╕реЗрд╡рд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ:
<service android:name="com.chucknorris.JokeService" android:icon="@drawable/icon" android:label="@string/app_name" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="com.google.android.glass.action.VOICE_TRIGGER"/> </intent-filter> <meta-data android:name="com.google.android.glass.VoiceTrigger" android:resource="@xml/voice_trigger_start"/> </service>
рдирд┐рдпрдорд┐рдд Android рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдпрд╣рд╛рдВ рдореБрдЦреНрдп рддрддреНрд╡ VoiceTrigger рд╣реИред
xml / voice_trigger_start рд╕рд░рд▓ рджрд┐рдЦрддрд╛ рд╣реИ:
<?xml version="1.0" encoding="utf-8"?> <trigger keyword="@string/chuck_norris_joke" />
рдФрд░ рдЕрдВрдд рдореЗрдВ, рдПрдХ рдкрдВрдХреНрддрд┐ рдЬреЛ рд╡рд╛рдХреНрдпрд╛рдВрд╢ рд╕реЗрдЯ рдХрд░рддреА рд╣реИ, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ рд╣рдорд╛рд░реА рд╕реЗрд╡рд╛ рд╢реБрд░реВ рдХрд░реЗрдЧреА:
<string name="chuck_norris_joke">say Chuck Norris joke</string>
рдиреЛрдЯ: Google рдЙрди рдирд┐рдпрдореЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЬреЛ рд╕рдХреНрд░рд┐рдпрдг рд╡рд╛рдХреНрдпрд╛рдВрд╢реЛрдВ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдЖрдЧреЗ рд░рдЦрддрд╛ рд╣реИ - рдЙрдиреНрд╣реЗрдВ рдПрдХ рдХреНрд░рд┐рдпрд╛ рд╕реЗ рд╢реБрд░реВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореБрдЭреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдпрд╣ рдирд┐рдпрдо рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╢реВрдореЗрдХрд░ рдХреЛ рдмреВрдЯ рдХреЗ рдКрдкрд░ рдиреНрдпрд╛рдп рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдЕрдзрд┐рдХрд╛рд░ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рджрд░реНрджрдирд╛рдХ рд╣реИ рдХрд┐ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╡рд╛рдХреНрдпрд╛рдВрд╢ "рд╢реЛ", "рдорд┐рд▓", "рдХрд╣рддреЗ рд╣реИрдВ", "рдкреНрд░рд╛рд░рдВрдн" рд╕реЗ рд╢реБрд░реВ рд╣реЛрдВрдЧреЗ
рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА
рдпрд╣рд╛рдБрдЕрдм рдЬрдм рд╣рдордиреЗ VoiceTrigger рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ, рддреЛ рд╣рдорд╛рд░реА рд╕реЗрд╡рд╛ рддрдм рд╢реБрд░реВ рд╣реЛрдЧреА рдЬрдм рд╣рдо рдХрд╣реЗрдВрдЧреЗ
"рдареАрдХ рдЧреНрд▓рд╛рд╕, рдЪрдХ рдиреЙрд░рд┐рд╕ рдордЬрд╛рдХ"рд╡реИрд╕реЗ, рд╡реЙрдпрд╕ рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЧрддрд┐рд╡рд┐рдзрд┐ рднреА рд╢реБрд░реВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рдкреНрд░рдХрдЯ рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧрд╛:
<activity android:name="com.google.android.glass.sample.waveform.WaveformActivity" > <intent-filter> <action android:name="com.google.android.glass.action.VOICE_TRIGGER" /> </intent-filter> <meta-data android:name="com.google.android.glass.VoiceTrigger" android:resource="@xml/voice_trigger_start" /> </activity>
рд╕реЗрд╡рд╛ рднрд░рдирд╛
рдореИрдВ рдХрд╛рд░реНрдб рдФрд░ рд▓рд╛рдЗрд╡ рдХрд╛рд░реНрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдФрд░ рд╕рдордпред рд╣рдорд╛рд░рд╛ рдордЬрд╛рдХ рдХреБрдЫ рднреА рдирд╣реАрдВ рджрд┐рдЦрд╛рдПрдЧрд╛, рдпрд╣ рд╕рд┐рд░реНрдл рдЬреЛрд░ рд╕реЗ рдордЬрд╛рдХ рд╣реЛрдЧрд╛ред
рдЪреВрдБрдХрд┐ рдЖрдкрдХреЛ рдЗрдВрдЯрд░рдиреЗрдЯ рд╕рдВрд╕рд╛рдзрди рдХрд╛ рдордЬрд╝рд╛рдХ рдЙрдбрд╝рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╣рдо AndroidManifest.x3 рдлрд╝реЛрди рдореЗрдВ рдЗрд╕ рдЖрд╢рдп рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рдирд╛ рдирд╣реАрдВ рднреВрд▓реЗрдВрдЧреЗ:
<uses-permission android:name="android.permission.INTERNET"/>
UI рдереНрд░реЗрдб рдореЗрдВ рдЗрдВрдЯрд░рдиреЗрдЯ рдХреЛ рд╕рд░реНрдл рдХрд░рдирд╛ рдирд┐рд╖рд┐рджреНрдз рд╣реИ, рд╣рдо рдЗрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП AsyncTask рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗ
doInBackground рд╡реЗрдм рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреБрд░реЛрдз рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ:
HttpClient client = new DefaultHttpClient(); HttpGet getRequest = new HttpGet(); try {
рдЗрд╕рдХреЗ рдмрд╛рдж рдЬрд░реНрд╕рди рдХреЛ:
String joke = ""; try { JSONObject jObject = new JSONObject(buff.toString()); joke = jObject.getJSONObject("value").getString("joke"); } catch (JSONException e) { Log.e("JSON exception", e.toString()); }
рдареАрдХ рд╣реИ рдЧреНрд▓рд╛рд╕ рдХрд╣реЛ
AsyncTask рдСрдирдкреЛрд╕реНрдЯ рдПрдХреНрд╕реНрдпреВрдЯреНрдпреВрдЯ рд╡рд┐рдзрд┐ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЬрдм рдЕрдиреБрд░реЛрдз рдкреВрд░рд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдордЬрд╝рд╛рдХ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ JSON рд╢реЗрд▓ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ - рдпрд╣ рдЬрд╝реЛрд░ рд╕реЗ рдХрд╣рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред Android рдХреГрдкрдпрд╛ рд╣рдореЗрдВ рди рдХреЗрд╡рд▓ рднрд╛рд╖рдг рдХреЛ рдкрд╣рдЪрд╛рдирдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ рдмрд▓реНрдХрд┐ TextToSpeech рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд╛рда рдХрд╛ рдЙрдЪреНрдЪрд╛рд░рдг рдХрд░рдиреЗ рдореЗрдВ рднреА рдорджрдж рдХрд░рддрд╛ рд╣реИред
рд╣рдо рд╕реЗрд╡рд╛ рдореЗрдВ TextToSpeech рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕реЗ AsyncTask рдореЗрдВ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред
tts = new TextToSpeech(this, new TextToSpeech.OnInitListener(){ @Override public void onInit(int i) {
onPostExecute рдирдП readOutLoud рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ
protected void onPostExecute(String joke) { if (exception != null) { return; } readOutLoud(joke); }
рдПрдХ рдордЬрд╝рд╛рдХ рдЬреЛрд░ рд╕реЗ рдкрдврд╝рдирд╛:
private void readOutLoud(String joke) { tts.speak(joke, TextToSpeech.QUEUE_FLUSH, null); }
рдбрд┐рдмрдЧрд┐рдВрдЧ рдФрд░ рдбрд┐рдмрдЧрд┐рдВрдЧ
рдЕрдм рдпрд╣ USB рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд╢реНрдорд╛ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИ, APK, рд╕рдВрд░реЗрдЦрд┐рдд рдХрд░реЗрдВ, рд╕рд╛рдЗрди рдЗрди рдХрд░реЗрдВ, рдкрд░рд┐рдирд┐рдпреЛрдЬрди (IDE рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рдХрд░реЗрдЧрд╛)ред рдХреЛрдИ рдЧрддрд┐рд╡рд┐рдзрд┐ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдЗрддрдирд╛ рдбреНрд░рдо рд░реЛрд▓
-
"рдУрдХреЗ рдЧреНрд▓рд╛рд╕, рдмреЛрд▓реЛ рдЪрдХ рдиреЙрд░рд┐рд╕ рдЬреЛрдХ"-
"рдЪрдХ рдиреЙрд░рд┐рд╕ рдПрдХ рдЗрдирдкреБрдЯ рд╕реНрдЯреНрд░реАрдо рд╕реЗ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред"рдПрдХ рдЖрдлреНрдЯрд░рд╡рд░реНрдб рдХреЗ рдмрдЬрд╛рдп
рдореИрдВ рдЗрд╕ рдЕрд╡рд╕рд░ рдХреЛ
www.icndb.com рдХреЛ рдзрдиреНрдпрд╡рд╛рдж рджреЗрддрд╛
рд╣реВрдВ ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рд╕реНрдЯрд░реНрд▓рд┐рдВрдЧрд┐рдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪреБрдЯрдХреБрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╛рди рд╕реЗрд╡рд╛ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рдЕрдЧрд░ рд╕рдордп рд╣реИ, рддреЛ рдореИрдВ рдпрд╣ рдХрд░реВрдБрдЧрд╛
рдЖрд╡рд╛рдЬ рдкреНрд▓реЗрдмреИрдХ рдХреЗ рд▓рд┐рдП рдХреЗ рд░реВрдк рдореЗрдВ
рдкрдврд╝рдиреЗ рдХреА рдЧрддрд┐ рдФрд░ / рдпрд╛ рдЖрд╡рд╛рдЬ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╡рддрдГ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╣реИрдВред OS X рдкрд░ рд╡реЗ рд╣реИрдВред
рдЖрдЗрдЯрдо рдкрд░ рд▓реМрдЯрддреЗ рд╣реБрдП "рдХреНрдпрд╛ рджрд┐рдЦрд╛рдирд╛ рд╣реИ"
рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдЯреБрдХрдбрд╝рд╛ рдЬреЛ рдЖрдкрдХреЛ рдмрд╛рдИрдВ рдУрд░ рдПрдХ рддрд╕реНрд╡реАрд░ рдФрд░ рдордЬрд╛рдХ рдХреЗ рдкрд╛рда рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрдерд┐рд░ рдХрд╛рд░реНрдб рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:
private void publishJokeCard(String joke) { Card card = new Card(ctx); card.setText(joke); card.addImage(R.drawable.chuck); TimelineManager.from(ctx).insert(card); }
рдХрд╛рд░реНрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдФрд░ - рдЕрдЧрд▓реА рдмрд╛рд░, рдЖрдкрдХреЛ рдЗрд╕реЗ рдереЛрдбрд╝рд╛ рд╕рдордЭрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдПрдХ рдЖрд╡реЗрджрди рд▓рд┐рдЦрддреЗ рд╕рдордп - рдЪрд╢реНрдореЗ рдкрд░ рддреИрдирд╛рдд - рдФрд░ рдПрд╕рдбреАрдХреЗ рдХрд╛ рдПрдХ рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реИред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдордВрдЪ рдкрд░ рдХрд┐рд╕реА рдиреЗ рдЕрдкрдирд╛ рдЕрдиреБрднрд╡ рд╕рд╛рдЭрд╛ рдХрд┐рдпрд╛ рдХрд┐ рдПрдХ рджрд┐рди рдкрд╣рд▓реЗ (рдЙрд╕ рд╕рдордп) рдПрдХ рдЕрдкрдбреЗрдЯ рд╕рд╛рдордиреЗ рдЖрдпрд╛ рдерд╛ред рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХрд╛рд░реНрдб
рдпрд╣рд╛рдБ рдХреИрд╕реЗ рджрд┐рдЦрддреЗ
рд╣реИрдВредрддрд╕реНрд╡реАрд░реЗрдВ
рдЖрдЗрдХрди рдХреЛ рддреИрдпрд╛рд░ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ - рдПрдХ рдкрд╛рд░рджрд░реНрд╢реА рдкреГрд╖реНрдарднреВрдорд┐ рдФрд░ 50x50 рдкрд┐рдХреНрд╕реЗрд▓ рдкрд░ рдореБрдЦреНрдп рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕рдлреЗрдж рд╣реИред
рдХрд╛рд░реНрдб рдХреЗ рд▓рд┐рдП рддрд╕реНрд╡реАрд░ - рдареАрдХ рд╣реИ, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдХреЛрдИ рднреА, рд▓реЗрдХрд┐рди рдмреЗрд╣рддрд░ - рдХрд╛рд░реНрдб рдХреА рдЪреМрдбрд╝рд╛рдИ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рд▓рдЧрднрдЧ рдПрдХ рддрд┐рд╣рд╛рдИ рдФрд░ рдХрд╛рд░реНрдб рдХреА рдКрдВрдЪрд╛рдИ рдХрд╛ рдкреВрд░рд╛ рдЖрдХрд╛рд░ред
рдЕрдВрдд рдореЗрдВ, рд╢рд╛рдпрдж рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рд╕рднреА рдЪреБрдЯрдХреБрд▓реЗ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рд╕рднреНрдп рдирд╣реАрдВ рд╣реИрдВред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╢рд░реНрдорд┐рдВрджрдЧреА рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, URL рдореЗрдВ "? Type = nerdy" рдЬреЛрдбрд╝рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред
рдХреЛрдб
рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ,
рддреЛ рдкреВрд░рд╛ рдХреЛрдбрдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдЙрджрд╛рд╣рд░рдг
рдпрд╣рд╛рдВ