当前位置: 首页 > 知识库问答 >
问题:

在android活动中不会回调onRequestPermissionsResult

赵经国
2023-03-14

我正在尝试在启动照相机活动之前从用户处获得照相机权限。onRequestPermissionsResult在用户从权限对话框中按“允许”后不会被回调。这是我的活动课:

public class ImageCaptureActivity extends AppCompatActivity {

    public static final String TAG = ImageCaptureActivity.class.getSimpleName();

    private static final int REQUEST_CAMERA = 0;
    private static final int REQUEST_CAMERA_PERMISSION = 1;
    private Point mSize;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_image_capture);

        Display display = getWindowManager().getDefaultDisplay();
        mSize = new Point();
        display.getSize(mSize);

        // Request for Camera Permission
        requestForCameraPermission(findViewById(android.R.id.content));
    }

    /**
     * @param view
     * @brief requestForCameraPermission
     */
    public void requestForCameraPermission(View view) {
        Log.v(TAG, "Requesting Camera Permission");

        final String permission = Manifest.permission.CAMERA;
        if (ContextCompat.checkSelfPermission(ImageCaptureActivity.this, permission)
                != PackageManager.PERMISSION_GRANTED) {
            if (ActivityCompat.shouldShowRequestPermissionRationale(ImageCaptureActivity.this, permission)) {
                showPermissionRationaleDialog(getString(R.string.camera_permission_rationale), permission);
            } else {
                requestForPermission(permission);
            }
        } else {
            launch();
        }
    }

    /**
     * @param message
     * @param permission
     * @brief showPermissionRationaleDialog
     */
    private void showPermissionRationaleDialog(final String message, final String permission) {
        new AlertDialog.Builder(ImageCaptureActivity.this)
                .setMessage(message)
                .setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        ImageCaptureActivity.this.requestForPermission(permission);
                    }
                })
                .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                    }
                })
                .create()
                .show();
    }

    /**
     * @param permission
     * @brief requestForPermission
     */
    private void requestForPermission(final String permission) {
        ActivityCompat.requestPermissions(ImageCaptureActivity.this, new String[]{permission}, REQUEST_CAMERA_PERMISSION);
    }

    /**
     * @brief launch
     */
    private void launch() {
        Log.v(TAG, "Camera Permission Granted, launching the CameraActivity");
        String documentId = getIntent().getStringExtra(IntentNames.INTENT_EXTRA_WIP_DOCUMENT_ID);
        Intent startCustomCameraIntent = new Intent(this, CameraActivity.class);
        startCustomCameraIntent.putExtra(IntentNames.INTENT_EXTRA_WIP_DOCUMENT_ID, documentId);
        startActivityForResult(startCustomCameraIntent, REQUEST_CAMERA);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode) {
            case REQUEST_CAMERA_PERMISSION:
                final int numOfRequest = grantResults.length;
                final boolean isGranted = numOfRequest == 1
                        && PackageManager.PERMISSION_GRANTED == grantResults[numOfRequest - 1];
                Log.v(TAG, "Camera Permission callback on onRequestPermissionsResult");
                if (isGranted) {
                    launch();
                }
                break;

            default:
                super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }
}

以下是具有摄像头权限的我的应用程序清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.myapp.testpackage">

    <uses-permission android:name="android.permission.CAMERA" />

    <uses-feature
        android:name="android.hardware.camera.front"
        android:required="true" />
    <uses-feature android:name="android.hardware.camera2" />

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

    <application

我的Gradle依赖:

compile 'com.android.support:appcompat-v7:24.0.0'

compile 'com.android.support:design:24.0.0'

compile 'com.android.support:support-v4:24.0.0'

共有1个答案

乜钱明
2023-03-14

我自己试过你的代码,一切都很好。我认为唯一可能出现问题的是当您的活动具有以下两个标志时的场景:

 android:noHistory="true"
 android:excludeFromRecents="true"

下面是一个解释问题的人:https://stackoverflow.com/a/35772265/5281581

 类似资料:
  • 我有一个主要的活动,当我点击一个按钮,开始一个新的活动时,我使用了以下代码: 上面的代码是从主活动中运行的。 现在在主活动调用的新活动中,我有一个后退按钮。当我点击这个后退按钮时,我希望我的新活动结束,它必须回到原来的主活动。 我尝试过调用,只是(从新活动),但这会关闭我的整个应用程序(包括我的主要活动)。 如何关闭当前关注的活动,然后返回到主活动? 编辑 事实上,我的手机的后退按钮也关闭了我的整

  • 所以我使用starActivityForResult()和SetResult返回数据,但当使用set结果()和完成()时,活动就死了,不会回到第一个... startActivityForResult所在的MainActivity类中..这是一个警报活动,因为我的应用程序是一个警报/提醒,在我的类中,我有另一个类,它是一个适配器 这是我的TimeDateRem,这里有一个ActivityResul

  • 我有一个包含3个活动的应用程序。 我有主要活动。这将调用第二个活动,然后调用第三个活动。我想在不进入 onCreate 的情况下返回到主要活动。 这是第三个活动的代码:

  • 我刚刚升级到Android Studio0.2.8,当我尝试编辑运行配置时,出现了一个错误,上面写着“找不到默认活动”。 请让我知道我能做些什么来解决这个问题。

  • 我正在分析android上的改型,并有一个关于回调与不使用它们的问题。我的印象是,回调只用于客户机可能希望的成功和失败响应。否则我会省略它。下面是一个没有回调的改型接口示例: 下面是一个带有回调的示例(我希望我是正确的): 我对两件事感到困惑:

  • 主要活动: 适配器: