首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >onResume()是在onStart()之前调用的吗?

onResume()是在onStart()之前调用的吗?
EN

Stack Overflow用户
提问于 2016-11-25 23:30:27
回答 1查看 944关注 0票数 0

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

如果应用程序还没有授予Manifest.permission.CAMERA许可,它会请求许可,然后继续启用扫描仪。

问题是,我在onResume()中调用onResume()并请求onStart()中的许可。因此,它应该先请求权限,然后请求之后调用onResume()中的barcodeView.resume()。但是显然相反的情况发生了,如果应用程序还没有获得许可,它就会抛出这个异常。

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

怎么会发生这种事?onResume()不是在onStart()之后调用的吗?

这是我的片段代码:

代码语言:javascript
运行
复制
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();
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-25 23:38:30

onStart在onResume前面被调用,是的。

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

所以事情会这样:

  • onStart
  • 请求许可
  • onResume (此时用户尚未授予权限)。

您需要在onResume中检查barcodeView是否为null,以及是否已授予权限。

如果权限被授予,onRequestPermissionsResult将在onStart之后立即被调用,因为如果授予了该权限,它就不是异步的,那么这段代码就会正常工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40813427

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档