1

Ich habe eine App, die ein Optionsfeld in den Einstellungen hat, die einen Hintergrunddienst auslöst, wenn es angekreuzt ist. Der Dienst benötigt die Berechtigung zum Aufzeichnen von Audio vom Benutzer, also habe ich die Berechtigung von den Einstellungen selbst angefordert, wenn der Benutzer das Kontrollkästchen aktiviert und den Dienst gestartet, nachdem die Berechtigung erteilt wurde. Dies ist mein Code:Android: Wenn Sie eine Berechtigung für eine Aktivität anfordern und einen Dienst starten, wird dem Dienst keine Berechtigung erteilt?

public void onSharedPreferenceChanged(SharedPreferences prefs, String key) { 

     Log.e("voice trigger button clicked 1") ; 
     CheckBoxPreference cpb=(CheckBoxPreference)findPreference("keyVoiceTrigger"); 
     cpb.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { 
      Context context=getActivity(); 


      public boolean onPreferenceClick(Preference preference) { 
       Log.e("voice trigger button clicked 1") ; 
       int permissionCheck1 = ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.RECORD_AUDIO); 
       //int permissionCheck2 = ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE); 
       if ((permissionCheck1 == PackageManager.PERMISSION_DENIED)){ 
        ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.RECORD_AUDIO}, 1); 
        return false; 
       } 

       context.startService(new Intent(getActivity(), com.speechrecognition.android.speak.service.VoiceService.class)); 
       return true; 
      } 
     }); 

     Preference pref = findPreference(key); 
     if (pref instanceof ListPreference) { 
      ListPreference lp = (ListPreference) pref; 
      if (mKeyMaxResults.equals(key)) { 
       updateSummaryInt(lp, R.plurals.summaryMaxResults, lp.getEntry().toString()); 
      } else { 
       pref.setSummary(lp.getEntry()); 
      } 
     } 
    } 

Nun, wenn ich die App es um die Erlaubnis bittet laufen Audio aufnehmen, wird der Dienst gestartet, aber wenn ich überprüfen, um die Erlaubnis, innerhalb des Service:

public int onStartCommand(Intent intent, int flags, int startId) { 
    Toast.makeText(getApplicationContext(),"yolololo",Toast.LENGTH_LONG).show(); 
    Log.e(LOG_TAG,"service started"); 

    // Check if user has given permission to record audio 
    int permissionCheck1 = ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO); 
    if (permissionCheck1 == PackageManager.PERMISSION_GRANTED) { 
     runRecognizerSetup(); 
    } 
    return super.onStartCommand(intent, flags, startId); 
} 

Verfahren runRecognizerSetup() startet nicht. Bitte helfen Sie! Vielen Dank.

Antwort

0

Ich denke, Sie müssen stattdessen die Erlaubnis vom Dienst anfordern. Aber von dem, woran ich mich erinnern kann, ist das ein bisschen schwierig.

Sie müssen wahrscheinlich zu

prüfen Erlaubnis in Service

If it's denied: Display notification through activity and request permission 

Ich werde sehen, ob ich oben graben kann, wie ich es gelöst.

+0

Sie können keine Berechtigungen von Diensten anfordern. –

1

requestPermissions ist kein synchroner Vorgang: Es zeigt dem Benutzer einen Dialog an, in dem er die Berechtigung genehmigen muss. Nur in onRequestPermissionsResult() erfahren Sie, ob der Benutzer die Berechtigung genehmigt oder verweigert hat.

Sie sollten Ihren Anruf zu startService zu der onRequestPermissionsResult() Methode verschieben und nur starten, wenn die Anforderung genehmigt wurde.

Verwandte Themen