Note that there are some explanatory texts on larger screens.

plurals
  1. POPermission Denial Error - SpeechRecognizer as a continuous service? (android.permission.INTERACT_ACROSS_USERS_FULL)
    primarykey
    data
    text
    <p>EDITED: I have changed my service code to implement as started service instead of IntentService as updated StreamService.java below Now, I am getting error regarding permission denial error as described in logcat messages after StreamService.java</p> <p>EDITED:</p> <pre><code>As mentioned in Android Developer site that SpeechRecognizer API can only be used as Application Context. Is there any woraround with which I can get it working </code></pre> <p>I have implemented MainActivity class that has all the UI Components. Class is as below</p> <p>CODE - MainActivity.java</p> <pre><code>package com.example.speechsensorservice; import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.View; import android.widget.ImageButton; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends Activity { private static final String TAG = "SpeechSensor"; private boolean headsetConnected = false; public TextView txtText; private BroadcastReceiver mReceiver; private ImageButton btnSpeak; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); txtText = (TextView) findViewById(R.id.txtText); btnSpeak = (ImageButton) findViewById(R.id.btnSpeak); btnSpeak.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(getApplicationContext(),StreamService.class); startService(intent); } }); } protected void onResume() { super.onResume(); IntentFilter sIF = new IntentFilter(); sIF.addAction(Intent.ACTION_HEADSET_PLUG); sIF.addAction("com.example.speechsensorservice.TEXT"); mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context arg0, Intent arg1) { // TODO Auto-generated method stub String act = arg1.getAction(); Log.d(TAG, "Received Action = " + act); if ( Intent.ACTION_HEADSET_PLUG.equals(act) ) { if ( arg1.hasExtra("state")) { if ( !headsetConnected &amp;&amp; arg1.getIntExtra("state", 0) == 1 ) { headsetConnected = true; txtText.setText("Headset Plugged in"); startNoiseProcessService(); } } } else if ( act.equals("com.example.speechsensorservice.TEXT") ){ if ( arg1.hasExtra("Identity")) { String s = arg1.getStringExtra("Identity"); if ( s.equals("NA") ) { Toast t = Toast.makeText(getApplicationContext(), "Your Device doesnot support Speech to Text", Toast.LENGTH_SHORT); t.show(); } else txtText.setText(s); } } } }; this.registerReceiver(mReceiver, sIF); } public void onPause() { super.onPause(); this.unregisterReceiver(this.mReceiver); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } public void startNoiseProcessService() { Intent intent = new Intent(this,StreamService.class); startService(intent); } } </code></pre> <p>Another class that I have implemented to start Speech Recognition Service as a background task by inheriting IntentService class. The implementation is as below</p> <p>Code - StreamService.java</p> <pre><code> package com.example.speechsensorservice; import java.util.ArrayList; import android.app.Service; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.os.IBinder; import android.speech.RecognitionListener; import android.speech.RecognizerIntent; import android.speech.SpeechRecognizer; import android.util.Log; public class StreamService extends Service { private static final String TAG = "SpeechSensor"; private static final String ACTION = "com.example.speechsensorservice.TEXT"; private SpeechRecognizer sr; private BroadcastReceiver sReceiver; private boolean headsetConnected = true; String text; @Override public IBinder onBind(Intent arg0) { // TODO Auto-generated method stub return null; } @Override public void onCreate() { Log.d(TAG, "onCreate() StreamService Method"); super.onCreate(); sReceiver = new BroadcastReceiver() { public void onReceive(Context arg0, Intent arg1) { // TODO Auto-generated method stub if ( Intent.ACTION_HEADSET_PLUG.equals(arg1.getAction()) ) { if ( arg1.hasExtra("state")) { if ( headsetConnected &amp;&amp; arg1.getIntExtra("state", 0) == 0 ) { headsetConnected = false; stopStreaming(); } } } } }; this.registerReceiver(sReceiver, new IntentFilter(Intent.ACTION_HEADSET_PLUG)); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.d(TAG,"Inside onStartCommand()"); // Runnable r = new Runnable() { // public void run() { startStreaming(); // } // }; // Thread t = new Thread(r); // t.start(); return Service.START_STICKY; } @Override public void onDestroy() { Log.d(TAG, "onDestroy() StreamService Method"); super.onDestroy(); this.unregisterReceiver(this.sReceiver); } public void startStreaming() { Log.d(TAG, "Inside startStreaming()"); Intent intent; text = ""; if ( !SpeechRecognizer.isRecognitionAvailable(this) ) { Log.d(TAG, "Not Applicable with your device"); text = "NA"; intent = new Intent(ACTION); intent.putExtra("Identity", text); sendBroadcast(intent); } else { Log.d(TAG, "started taking input"); sr = SpeechRecognizer.createSpeechRecognizer(this.getApplicationContext()); intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); //intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, "hi-IN"); intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, "en-US");//RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);//RecognizerIntent.LANGUAGE_MODEL_WEB_SEARCH); // intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 3); sr.setRecognitionListener( new mylistener()); sr.startListening(intent); } } public void stopStreaming() { if ( sr == null ) return; Log.d(TAG, "stopped taking input"); sr.cancel(); sr.destroy(); sr = null; this.stopSelf(); } public boolean isStreaming() { // TODO Auto-generated method stub Log.d(TAG,"isStreaming : YES"); if ( sr != null ) return true; return false; } class mylistener implements RecognitionListener { @Override public void onBeginningOfSpeech() { // TODO Auto-generated method stub Log.d(TAG, "onBeginningOfSpeech"); } @Override public void onBufferReceived(byte[] arg0) { // TODO Auto-generated method stub } @Override public void onEndOfSpeech() { // TODO Auto-generated method stub Log.d(TAG, "onEndOfSpeech"); } @Override public void onError(int arg0) { // TODO Auto-generated method stub } @Override public void onEvent(int arg0, Bundle arg1) { // TODO Auto-generated method stub } @Override public void onPartialResults(Bundle arg0) { // TODO Auto-generated method stub } @Override public void onReadyForSpeech(Bundle arg0) { // TODO Auto-generated method stub Log.d(TAG, "onReadyForSpeech"); } @Override public void onResults(Bundle arg0) { // TODO Auto-generated method stub Log.d(TAG, "Got Results"); ArrayList&lt;String&gt; al = arg0.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION); text = al.get(0); for ( int i =0 ; i &lt; al.size(); i++ ) { Log.d(TAG,"result=" + al.get(i)); } Intent intent = new Intent(ACTION); intent.putExtra("Identifier", text); sendBroadcast(intent); // startStreaming(); } @Override public void onRmsChanged(float arg0) { // TODO Auto-generated method stub } } } </code></pre> <p>Here I am getting error <code>java.lang.RuntimeException: SpeechRecognizer should be used only from the application's main thread</code></p> <p>Code flow is like this:</p> <p>ImageButton->onClick()->Fire the service Intent for StreamService.class->onCreate()->onHandleIntent()->calling startStreaming() -> getting error</p> <p>LogCat Message:</p> <pre><code>12-13 17:03:24.822 794 7381 E DatabaseUtils: Writing exception to parcel 12-13 17:03:24.822 794 7381 E DatabaseUtils: java.lang.SecurityException: Permission Denial: get/set setting for user asks to run as user -2 but is calling from user 0; this requires android.permission.INTERACT_ACROSS_USERS_FULL 12-13 17:03:24.822 794 7381 E DatabaseUtils: at com.android.server.am.ActivityManagerService.handleIncomingUser(ActivityManagerService.java:12754) 12-13 17:03:24.822 794 7381 E DatabaseUtils: at android.app.ActivityManager.handleIncomingUser(ActivityManager.java:1998) 12-13 17:03:24.822 794 7381 E DatabaseUtils: at com.android.providers.settings.SettingsProvider.call(SettingsProvider.java:574) 12-13 17:03:24.822 794 7381 E DatabaseUtils: at android.content.ContentProvider$Transport.call(ContentProvider.java:256) 12-13 17:03:24.822 794 7381 E DatabaseUtils: at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:256) 12-13 17:03:24.822 794 7381 E DatabaseUtils: at android.os.Binder.execTransact(Binder.java:351) 12-13 17:03:24.822 794 7381 E DatabaseUtils: at dalvik.system.NativeStart.run(Native Method) </code></pre>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload