Android:从活动请求权限并启动服务不会授予该服务权限?

Android:从活动请求权限并启动服务不会授予该服务权限?,android,android-activity,permissions,android-service,android-permissions,Android,Android Activity,Permissions,Android Service,Android Permissions,我有一个应用程序,它在首选项中有一个选项复选框,当它勾选时会触发后台服务。该服务需要从用户那里录制音频的权限,因此当用户选中该框时,我从preferences活动本身请求权限,并在授予权限后启动该服务。这是我的代码: public void onSharedPreferenceChanged(SharedPreferences prefs, String key) { Log.e("voice trigger button clicked 1") ; C

我有一个应用程序,它在首选项中有一个选项复选框,当它勾选时会触发后台服务。该服务需要从用户那里录制音频的权限,因此当用户选中该框时,我从preferences活动本身请求权限,并在授予权限后启动该服务。这是我的代码:

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

RunRecognitizerSetup()方法未启动。请帮忙!谢谢。

我想你应该向服务部门申请许可。但据我记忆所及,这有点棘手

你可能需要

在服务中检查权限

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

我会看看我是否能找出我是如何解决的。

requestPermissions
不是一个同步操作:它向用户显示一个对话框,用户必须在其中批准权限。只有在用户批准或拒绝权限时,您才能了解


您应该将对
startService
的调用移动到
onRequestPermissionsResult()
方法,并仅在请求获得批准时启动它。

您不能向服务请求权限。