繁体   English   中英

Android-在片段中,在onStart()之前调用onResume()吗?

[英]Android - In fragments, Is onResume() called before onStart()?

在我正在构建的应用程序的一部分中,有一个嵌入式的zxing qr扫描仪,我正在一个片段中使用它。

如果该应用尚未授予Manifest.permission.CAMERA权限,则它会请求该权限,然后继续启用扫描仪。

问题是,我在onResume() barcodeView.resume()内调用了barcodeView.resume()并在onStart()请求了权限。 所以应该要求许可第一之后调用barcodeView.resume()onResume() 但是显然相反,如果尚未授予该应用程序许可,它将引发此异常

java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法'void com.journeyapps.barcodescanner.DecoratedBarcodeView.resume()'

怎么会这样呢? 难道不是在onStart()之后onStart() onResume()吗?

这是我的片段代码:

package com.lab.rafael.smartattendance;

import android.Manifest;
import android.content.pm.PackageManager;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.Fragment;
import android.support.v4.content.ContextCompat;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.google.zxing.ResultPoint;
import com.google.zxing.client.android.BeepManager;
import com.journeyapps.barcodescanner.BarcodeCallback;
import com.journeyapps.barcodescanner.BarcodeResult;
import com.journeyapps.barcodescanner.DecoratedBarcodeView;

import java.util.List;


public class TakeAttendanceFragment extends Fragment {

    private final int CAMERA_PERM_REQUEST = 0;
    private static final String TAG = TakeAttendanceFragment.class.getSimpleName();
    DecoratedBarcodeView barcodeView = null;
    BeepManager beepManager = null;
    String lastText;

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        return inflater.inflate(R.layout.fragment_take_attendance, container, false);
    }

    @Override
    public void onStart() {
        super.onStart();
        if(getActivity().getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)){
            if(ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED)
            {
                ActivityCompat.requestPermissions(getActivity(), new String[] {Manifest.permission.CAMERA}, CAMERA_PERM_REQUEST);
            } else {
                startCamera();
            }
        }
    }

    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        if(requestCode == CAMERA_PERM_REQUEST) {
            if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                startCamera();
            }
        }
    }

    private void startCamera() {
        try {
            if(getView() != null) {
                barcodeView = (DecoratedBarcodeView) getView().findViewById(R.id.barcode_scanner);
                barcodeView.decodeContinuous(barcodeCallback);
                beepManager = new BeepManager(getActivity());
            }
        } catch (Exception e) {
            Log.e(TAG, e.getMessage());
        }
    }

    private BarcodeCallback barcodeCallback = new BarcodeCallback() {
        @Override
        public void barcodeResult(BarcodeResult result) {
            if(result.getText() == null || result.getText().equals(lastText)) return;

            lastText = result.getText();
            barcodeView.setStatusText(lastText);
            beepManager.playBeepSoundAndVibrate();
        }

        @Override
        public void possibleResultPoints(List<ResultPoint> resultPoints) {

        }
    };

    public void onResume()
    {
        super.onResume();
        barcodeView.resume();
    }

    public void onPause() {
        super.onPause();
        barcodeView.pause();
    }
}

在onResume之前调用onStart,是的。

权限请求对话框没有阻止,因此当您请求权限时,片段生命周期将继续。

所以它会像这样:
-onStart
-请求权限
-onResume(目前用户尚未授予权限)。

您需要在onResume中进行检查,以查看barcodeView是否不为null并已授予权限。

如果授予了权限,则onRequestPermissionsResult将在onStart之后立即调用,因为如果授予了权限,则它不是异步的,则此代码可以正常工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM