0

在我正在構建的應用程序的一部分中,有一個嵌入式zxing qr掃描程序,並在片段中使用它。Android - 在片段中,is onResume()在onStart()之前調用?

如果應用程序尚未授予Manifest.permission.CAMERA權限,它會請求權限,然後繼續啓用掃描程序。

問題是,我在onResume()裏面撥打barcodeView.resume(),我要求onStart()的許可。所以它應該請求的許可onResume()內調用barcodeView.resume()。但很顯然,發生相反的情況,如果應用程序沒有授予權限的是,它引發此異常

顯示java.lang.NullPointerException:試圖調用虛擬方法無效 com.journeyapps.barcodescanner.DecoratedBarcodeView.resume( )' 空對象參考

這是怎麼回事? 是不是之前調用onStart()

這裏是我的代碼片段:

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(); 
    } 
} 

回答

0

在onStart中的onResume之前調用,是的。

權限請求對話框未被阻止,因此當您詢問權限時,片段生命週期將繼續。

所以它會是這樣的:
- 在onStart
- 請求允許
- 的onResume(此時用戶沒有授予權限還)。

您需要在onResume中檢查以查看barcodeView是否爲空並且已授予權限。

如果權限被授予,onStart會立即調用onRequestPermissionsResult,因爲如果權限被授予,它不是異步的,那麼這個代碼就可以正常工作。

相關問題