13 package ai.picovoice.porcupine.demo;
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;
31 import androidx.annotation.NonNull;
32 import androidx.appcompat.app.AppCompatActivity;
33 import androidx.core.app.ActivityCompat;
34 import androidx.core.content.ContextCompat;
42 private static final String
ACCESS_KEY =
"${YOUR_ACCESS_KEY_HERE}";
48 final Spinner mySpinner = findViewById(
R.id.keyword_spinner);
49 final String keywordName = mySpinner.getSelectedItem().toString();
60 String.format(
"%s\nEnsure your accessKey '%s' is a valid access key.", e.getMessage(),
ACCESS_KEY)
88 public void invoke(
int keywordIndex) {
89 runOnUiThread(
new Runnable() {
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) {
101 public void onTick(
long millisUntilFinished) {
108 public void onFinish() {
109 layout.setBackgroundColor(Color.TRANSPARENT);
118 runOnUiThread(
new Runnable() {
121 TextView errorText = findViewById(
R.id.errorMessage);
122 errorText.setText(errorMessage);
123 errorText.setVisibility(View.VISIBLE);
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);
136 Toast.makeText(
this, message, Toast.LENGTH_SHORT).show();
140 Spinner
spinner = findViewById(
R.id.keyword_spinner);
142 ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
145 R.layout.keyword_spinner_item);
146 adapter.setDropDownViewResource(
R.layout.keyword_spinner_item);
149 final ToggleButton recordButton = findViewById(
R.id.record_button);
151 spinner.setOnItemSelectedListener(
new AdapterView.OnItemSelectedListener() {
153 public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
154 if (recordButton.isChecked()) {
156 recordButton.toggle();
161 public void onNothingSelected(AdapterView<?> parentView) {
168 protected void onCreate(Bundle savedInstanceState) {
169 super.onCreate(savedInstanceState);
170 setContentView(
R.layout.activity_main);
171 notificationPlayer = MediaPlayer.create(
this,
R.raw.notification);
173 configureKeywordSpinner();
178 ToggleButton recordButton = findViewById(
R.id.record_button);
179 recordButton.setChecked(
false);
185 return ActivityCompat.checkSelfPermission(
this, Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED;
189 ActivityCompat.requestPermissions(
this,
new String[]{Manifest.permission.RECORD_AUDIO}, 0);
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");
203 ToggleButton recordButton = findViewById(
R.id.record_button);
204 if (recordButton.isChecked()) {
205 if (hasRecordPermission()) {
208 requestRecordPermission();