1

我有一个应用程序,它有一个选项复选框,当它打勾时触发后台服务。该服务需要权限来记录来自用户的音频,因此当用户选中该框时,我请求了首选项活动本身的许可,并在授予权限后启动该服务。这是我的代码:Android:从活动请求许可并启动服务不授予服务许可?

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()); 
      } 
     } 
    } 

现在,当我运行它要求允许录制音频的应用程序,该服务已启动,但是当我检查的权限里面的服务:

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); 
} 

的方法runRecognizerSetup()不启动。请帮忙!谢谢。

回答

0

我认为您必须改用服务请求权限。但从我能记得的那一点来看,这有点棘手。

你可能需要

检查许可服务

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

我去看看我能挖了我如何解决它。

+0

您无法从服务请求权限。 –

1

requestPermissions不是一个同步操作:它向用户显示一个对话框,他们必须批准权限。只有在onRequestPermissionsResult()中,您才了解用户是否批准了该权限。

您应该将您的电话转到startServiceonRequestPermissionsResult()方法,并且只有在请求被批准后才能启动它。