【问题标题】:Android: Requesting permission from an activity and launching a service does not grant the permission to the service?Android:向活动请求权限并启动服务不会授予服务权限?
【发布时间】:2017-03-23 12:21:46
【问题描述】:

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

    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() 没有启动。请帮忙!谢谢。

【问题讨论】:

    标签: android android-activity permissions android-service android-permissions


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      我认为您必须改为向服务请求许可。但据我所知,这有点棘手。

      你可能需要

      检查服务中的权限

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

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

      【讨论】:

      • 您不能向服务请求权限。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-18
      • 2019-03-15
      • 1970-01-01
      相关资源
      最近更新 更多