porcupine/demo/android/Activity/porcupine-activity-demo-app/src/main/java/ai/picovoice/porcupine/demo/MainActivity.java
Go to the documentation of this file.
1 /*
2  Copyright 2021 Picovoice Inc.
3 
4  You may not use this file except in compliance with the license. A copy of the license is
5  located in the "LICENSE" file accompanying this source.
6 
7  Unless required by applicable law or agreed to in writing, software distributed under the
8  License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
9  express or implied. See the License for the specific language governing permissions and
10  limitations under the License.
11 */
12 
13 package ai.picovoice.porcupine.demo;
14 
15 
16 import android.Manifest;
17 import android.content.pm.PackageManager;
18 import android.graphics.Color;
19 import android.media.MediaPlayer;
20 import android.os.Bundle;
21 import android.os.CountDownTimer;
22 import android.view.View;
23 import android.widget.AdapterView;
24 import android.widget.ArrayAdapter;
25 import android.widget.RelativeLayout;
26 import android.widget.Spinner;
27 import android.widget.TextView;
28 import android.widget.Toast;
29 import android.widget.ToggleButton;
30 
31 import androidx.annotation.NonNull;
32 import androidx.appcompat.app.AppCompatActivity;
33 import androidx.core.app.ActivityCompat;
34 import androidx.core.content.ContextCompat;
35 
36 import ai.picovoice.porcupine.*;
37 
38 
39 public class MainActivity extends AppCompatActivity {
41 
42  private static final String ACCESS_KEY = "${YOUR_ACCESS_KEY_HERE}";
43 
44  private MediaPlayer notificationPlayer;
45 
46  private void startPorcupine() {
47  try {
48  final Spinner mySpinner = findViewById(R.id.keyword_spinner);
49  final String keywordName = mySpinner.getSelectedItem().toString();
50 
51  Porcupine.BuiltInKeyword keyword = Porcupine.BuiltInKeyword.valueOf(keywordName.toUpperCase().replace(" ", "_"));
54  .setKeyword(keyword)
55  .setSensitivity(0.7f)
56  .build(getApplicationContext(), porcupineManagerCallback);
60  String.format("%s\nEnsure your accessKey '%s' is a valid access key.", e.getMessage(), ACCESS_KEY)
61  );
62  } catch (PorcupineActivationException e) {
63  onPorcupineInitError("AccessKey activation error");
65  onPorcupineInitError("AccessKey reached its device limit");
67  onPorcupineInitError("AccessKey refused");
69  onPorcupineInitError("AccessKey has been throttled");
70  } catch (PorcupineException e) {
71  onPorcupineInitError("Failed to initialize Porcupine " + e.getMessage());
72  }
73  }
74 
75  private void stopPorcupine() {
76  if (porcupineManager != null) {
77  try {
80  } catch (PorcupineException e) {
81  displayError("Failed to stop Porcupine.");
82  }
83  }
84  }
85 
87  @Override
88  public void invoke(int keywordIndex) {
89  runOnUiThread(new Runnable() {
90  @Override
91  public void run() {
92  if (!notificationPlayer.isPlaying()) {
93  notificationPlayer.start();
94  }
95 
96  final int detectedBackgroundColor = getResources().getColor(R.color.colorAccent);
97  final RelativeLayout layout = findViewById(R.id.layout);
98  layout.setBackgroundColor(detectedBackgroundColor);
99  new CountDownTimer(1000, 100) {
100  @Override
101  public void onTick(long millisUntilFinished) {
102  if (!notificationPlayer.isPlaying()) {
103  notificationPlayer.start();
104  }
105  }
106 
107  @Override
108  public void onFinish() {
109  layout.setBackgroundColor(Color.TRANSPARENT);
110  }
111  }.start();
112  }
113  });
114  }
115  };
116 
117  private void onPorcupineInitError(final String errorMessage) {
118  runOnUiThread(new Runnable() {
119  @Override
120  public void run() {
121  TextView errorText = findViewById(R.id.errorMessage);
122  errorText.setText(errorMessage);
123  errorText.setVisibility(View.VISIBLE);
124 
125  ToggleButton recordButton = findViewById(R.id.record_button);
126  recordButton.setBackground(ContextCompat.getDrawable(
127  getApplicationContext(),
128  R.drawable.button_disabled));
129  recordButton.setChecked(false);
130  recordButton.setEnabled(false);
131  }
132  });
133  }
134 
135  private void displayError(String message) {
136  Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
137  }
138 
139  private void configureKeywordSpinner() {
140  Spinner spinner = findViewById(R.id.keyword_spinner);
141 
142  ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
143  this,
144  R.array.keywords,
145  R.layout.keyword_spinner_item);
146  adapter.setDropDownViewResource(R.layout.keyword_spinner_item);
147  spinner.setAdapter(adapter);
148 
149  final ToggleButton recordButton = findViewById(R.id.record_button);
150 
151  spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
152  @Override
153  public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
154  if (recordButton.isChecked()) {
155  stopPorcupine();
156  recordButton.toggle();
157  }
158  }
159 
160  @Override
161  public void onNothingSelected(AdapterView<?> parentView) {
162  // Do nothing.
163  }
164  });
165  }
166 
167  @Override
168  protected void onCreate(Bundle savedInstanceState) {
169  super.onCreate(savedInstanceState);
170  setContentView(R.layout.activity_main);
171  notificationPlayer = MediaPlayer.create(this, R.raw.notification);
172 
173  configureKeywordSpinner();
174  }
175 
176  @Override
177  protected void onStop() {
178  ToggleButton recordButton = findViewById(R.id.record_button);
179  recordButton.setChecked(false);
180 
181  super.onStop();
182  }
183 
184  private boolean hasRecordPermission() {
185  return ActivityCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED;
186  }
187 
188  private void requestRecordPermission() {
189  ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.RECORD_AUDIO}, 0);
190  }
191 
192  @Override
193  public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
194  super.onRequestPermissionsResult(requestCode, permissions, grantResults);
195  if (grantResults.length == 0 || grantResults[0] == PackageManager.PERMISSION_DENIED) {
196  onPorcupineInitError("Microphone permission is required for this demo");
197  } else {
198  startPorcupine();
199  }
200  }
201 
202  public void process(View view) {
203  ToggleButton recordButton = findViewById(R.id.record_button);
204  if (recordButton.isChecked()) {
205  if (hasRecordPermission()) {
206  startPorcupine();
207  } else {
208  requestRecordPermission();
209  }
210  } else {
211  stopPorcupine();
212  }
213  }
214 }
R
#define R
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/extras/stb_vorbis.c:5104
ai.picovoice.porcupine.demo.MainActivity.onRequestPermissionsResult
void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)
Definition: porcupine/demo/android/Activity/porcupine-activity-demo-app/src/main/java/ai/picovoice/porcupine/demo/MainActivity.java:193
ai.picovoice.porcupine
Definition: android/Porcupine/porcupine/src/main/java/ai/picovoice/porcupine/exception/PorcupineActivationException.java:11
ai.picovoice.porcupine.demo.MainActivity.onPorcupineInitError
void onPorcupineInitError(final String errorMessage)
Definition: porcupine/demo/android/Activity/porcupine-activity-demo-app/src/main/java/ai/picovoice/porcupine/demo/MainActivity.java:117
run
void run(class_loader::ClassLoader *loader)
ai.picovoice.porcupine.demo.MainActivity.onCreate
void onCreate(Bundle savedInstanceState)
Definition: porcupine/demo/android/Activity/porcupine-activity-demo-app/src/main/java/ai/picovoice/porcupine/demo/MainActivity.java:168
ai.picovoice.porcupine.PorcupineManager.start
void start()
Definition: PorcupineManager.java:70
ai.picovoice.porcupine.PorcupineManager.Builder.setAccessKey
PorcupineManager.Builder setAccessKey(String accessKey)
Definition: PorcupineManager.java:100
ai.picovoice.porcupine.PorcupineManager.Builder
Definition: PorcupineManager.java:91
ai.picovoice.porcupine.demo.MainActivity
Definition: porcupine/demo/android/Activity/porcupine-activity-demo-app/src/main/java/ai/picovoice/porcupine/demo/MainActivity.java:39
ai.picovoice.porcupine.PorcupineManager.delete
void delete()
Definition: PorcupineManager.java:62
ai.picovoice.porcupine.demo.MainActivity.porcupineManagerCallback
final PorcupineManagerCallback porcupineManagerCallback
Definition: porcupine/demo/android/Activity/porcupine-activity-demo-app/src/main/java/ai/picovoice/porcupine/demo/MainActivity.java:86
f
f
spinner
void spinner()
ai.picovoice.porcupine.demo.MainActivity.process
void process(View view)
Definition: porcupine/demo/android/Activity/porcupine-activity-demo-app/src/main/java/ai/picovoice/porcupine/demo/MainActivity.java:202
ai.picovoice.porcupine.PorcupineActivationRefusedException
Definition: android/Porcupine/porcupine/src/main/java/ai/picovoice/porcupine/exception/PorcupineActivationRefusedException.java:13
ai.picovoice.porcupine.PorcupineException
Definition: android/Porcupine/porcupine/src/main/java/ai/picovoice/porcupine/exception/PorcupineException.java:13
ai.picovoice.porcupine.demo.MainActivity.stopPorcupine
void stopPorcupine()
Definition: porcupine/demo/android/Activity/porcupine-activity-demo-app/src/main/java/ai/picovoice/porcupine/demo/MainActivity.java:75
ai.picovoice.porcupine.PorcupineActivationException
Definition: android/Porcupine/porcupine/src/main/java/ai/picovoice/porcupine/exception/PorcupineActivationException.java:13
ai.picovoice.porcupine.PorcupineActivationLimitException
Definition: android/Porcupine/porcupine/src/main/java/ai/picovoice/porcupine/exception/PorcupineActivationLimitException.java:13
ai.picovoice.porcupine.demo.MainActivity.hasRecordPermission
boolean hasRecordPermission()
Definition: porcupine/demo/android/Activity/porcupine-activity-demo-app/src/main/java/ai/picovoice/porcupine/demo/MainActivity.java:184
ai.picovoice.porcupine.demo.MainActivity.displayError
void displayError(String message)
Definition: porcupine/demo/android/Activity/porcupine-activity-demo-app/src/main/java/ai/picovoice/porcupine/demo/MainActivity.java:135
ai.picovoice.porcupine.demo.MainActivity.onStop
void onStop()
Definition: porcupine/demo/android/Activity/porcupine-activity-demo-app/src/main/java/ai/picovoice/porcupine/demo/MainActivity.java:177
ai.picovoice.porcupine.demo.MainActivity.notificationPlayer
MediaPlayer notificationPlayer
Definition: porcupine/demo/android/Activity/porcupine-activity-demo-app/src/main/java/ai/picovoice/porcupine/demo/MainActivity.java:44
ai.picovoice.porcupine.demo.MainActivity.configureKeywordSpinner
void configureKeywordSpinner()
Definition: porcupine/demo/android/Activity/porcupine-activity-demo-app/src/main/java/ai/picovoice/porcupine/demo/MainActivity.java:139
ai
ai.picovoice.porcupine.demo.MainActivity.requestRecordPermission
void requestRecordPermission()
Definition: porcupine/demo/android/Activity/porcupine-activity-demo-app/src/main/java/ai/picovoice/porcupine/demo/MainActivity.java:188
ai.picovoice
ai.picovoice.porcupine.demo.MainActivity.porcupineManager
PorcupineManager porcupineManager
Definition: porcupine/demo/android/Activity/porcupine-activity-demo-app/src/main/java/ai/picovoice/porcupine/demo/MainActivity.java:40
ai.picovoice.porcupine.PorcupineManagerCallback
Definition: PorcupineManagerCallback.java:15
ai.picovoice.porcupine.Porcupine
Definition: android/Porcupine/porcupine/src/main/java/ai/picovoice/porcupine/Porcupine.java:35
ai.picovoice.porcupine.PorcupineActivationThrottledException
Definition: android/Porcupine/porcupine/src/main/java/ai/picovoice/porcupine/exception/PorcupineActivationThrottledException.java:13
ai.picovoice.porcupine.demo.MainActivity.ACCESS_KEY
static final String ACCESS_KEY
Definition: porcupine/demo/android/Activity/porcupine-activity-demo-app/src/main/java/ai/picovoice/porcupine/demo/MainActivity.java:42
ai.picovoice.porcupine.PorcupineManager
Definition: PorcupineManager.java:35
ai.picovoice.porcupine.demo.MainActivity.startPorcupine
void startPorcupine()
Definition: porcupine/demo/android/Activity/porcupine-activity-demo-app/src/main/java/ai/picovoice/porcupine/demo/MainActivity.java:46
ai.picovoice.porcupine.Porcupine.BuiltInKeyword
Definition: android/Porcupine/porcupine/src/main/java/ai/picovoice/porcupine/Porcupine.java:145
ai.picovoice.porcupine.PorcupineInvalidArgumentException
Definition: android/Porcupine/porcupine/src/main/java/ai/picovoice/porcupine/exception/PorcupineInvalidArgumentException.java:13
ai.picovoice.porcupine.PorcupineManager.stop
void stop()
Definition: PorcupineManager.java:80


picovoice_driver
Author(s):
autogenerated on Fri Apr 1 2022 02:13:56