请求服务许可。 Android M

时间:2016-02-02 10:04:23

标签: android android-permissions android-6.0-marshmallow

我正在研究M的Android权限。

在我的活动的应用程序中,我正在启动一项服务,我正在使用以下代码进行操作。

在服务中打开相机的代码

cameraManager.openCamera(frontFacingCameraId, stateCallback, null);

我检查了一些文件,我发现我无法请求服务许可,我需要在活动中询问许可。所以我在我的活动中要求许可。

请求许可的活动

if (PermissionUtil.getCameraPermission(this)) { Debug.d(TAG, "Camera Permission -- permission exsited"); performRecordingAction(); }

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    switch (requestCode) {
        case PermissionUtil.SDK__CAMERA_PERMISSION:
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                Debug.d(TAG, "Granted -- Camera Permission");
                performRecordingAction();
            } else {
                Debug.d(TAG, "Denied -- Camera Permission");
                // permission denied, boo! Disable the
                // functionality that depends on this permission.
            }
            break;
    }
}

PermissionUtil

public static boolean getCameraPermission(Activity activity) {
    Debug.d(TAG, "getCameraPermission");
    int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.CAMERA);

    if (permission != PackageManager.PERMISSION_GRANTED) {
        if (ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.CAMERA)) {
            Debug.d(TAG, "Already Denied -- Camera Permission");
            return false;
        } else {
            Debug.d(TAG, "Request Camera Permission");
            ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.CAMERA}, SDK__CAMERA_PERMISSION);
            return false;
        }
    } else {
        return true;
    }
}

但是在上面的服务中,它仍然会因安全异常而抛出错误。

有谁可以建议我犯错的地方?有没有办法请求服务许可?

3 个答案:

答案 0 :(得分:0)

只需在清单文件中添加public static DataTable CollateResult(DataTable table) { DataTable m_table = table.Copy(); foreach (DataRow row in table.Rows) { string m_date = DateTime.Parse(row["event_time"].ToString()).ToString("yyyy-MM-dd"); if (m_table.Rows.Count > 0 && m_table.Rows[m_table.Rows.Count - 1]["event_time"].ToString().Equals(m_date)) { foreach (DataColumn column in table.Columns) { if (!column.ColumnName.Equals("event_time") && !column.ColumnName.Equals("application_id") && !column.ColumnName.Equals("country") && !column.ColumnName.Equals("package")) { m_table.Rows[m_table.Rows.Count - 1][column.ColumnName] = (int.Parse(m_table.Rows[m_table.Rows.Count - 1][column.ColumnName].ToString()) + int.Parse(row[column.ColumnName].ToString())); } else { if (!column.ColumnName.Equals("event_time")) m_table.Rows[m_table.Rows.Count - 1][column.ColumnName] = row[column.ColumnName].ToString(); } } } else { DataRow m_row = m_table.NewRow(); foreach (DataColumn column in table.Columns) { if (column.ColumnName.Equals("event_time")) m_row["event_time"] = m_date; else m_row[column.ColumnName] = row[column.ColumnName]; } m_table.Rows.Add(m_row); } } return m_table; } ,如下所示:

android:exported="true"

它将解决安全例外问题。

有没有办法请求服务许可?

Ya,请关注Requesting permission from service

答案 1 :(得分:0)

您无法从服务请求权限,因为您需要系统提供的回调的Activity上下文。此外,权限请求也是从您的应用程序异步运行的。 另请参阅 requestPermissions() >>LINK中的文档:

  

此方法可以启动允许用户选择哪个活动   授予权限和拒绝权限。因此,你应该   准备好您的活动可能会暂停并恢复。进一步,   授予某些权限可能需要重新启动您的应用程序。在   在这种情况下,系统将重新创建活动堆栈   将结果传递给onRequestPermissionsResult(int,String [],   INT [])。

服务只能检查他是否在运行时具有所需权限,然后调整其行为。

答案 2 :(得分:0)

由于有必要在android SDK 23(及更高版本)中内联检查权限,因此您可以忽略shouldShowRequestPermissionRationale(提示用户设置权限),而只需检查之前是否授予了权限:

public boolean checkPermission(){
    if (Build.VERSION.SDK_INT < 23) {
        return true;
    }
    else {
        if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
            // if (ActivityCompat.shouldShowRequestPermissionRationale(this,
            //        android.Manifest.permission.CAMERA)) {
            //    PropmtForPermission();
            //} else {

                return false;
            //}
        }
        else{
            return true;
        }
    }
}