0

私が構築しているアプリケーションのセクションには、埋め込まれたzxing qrスキャナがあります。これをフラグメント内で使用しています。Android - フラグメントでは、onStart()の前にonResume()が呼び出されていますか?

まだアプリにManifest.permission.CAMERAのアクセス権が付与されていない場合は、許可を求められてからスキャナを有効にします。

問題は、私はbarcodeView.resume()onResume()の中に呼び出し、onStart()に許可を求めます。したがって、onResume()の中にbarcodeView.resume()を呼び出して、の最初のの後にの許可を求める必要があります。仮想メソッド「空 com.journeyapps.barcodescanner.DecoratedBarcodeView.resumeを起動しようと(:どうやら反対が起こったアプリがまだ許可が付与されていない場合でも、それは

java.lang.NullPointerExceptionがこの例外をスローします) 'on a ヌルオブジェクトリファレンス

どうしたのですか? 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(); 
    } 
} 

答えて

0

ONSTARTはonResume前に呼び出されます、はい。

権限要求ダイアログはブロックされていないため、権限を要求するとフラグメントライフサイクルが続行されます。

だから、このように行くよ:
- ONSTART
- 要求許可
- onResume(この時点では、ユーザはまだ許可を付与していません)。

barcodeViewがnullでなく、許可が与えられているかどうかを確認するには、onResumeをチェックする必要があります。

アクセス許可が与えられている場合、onRequestPermissionsResultはonStartの直後に呼び出されます。アクセス許可が与えられていれば非同期ではないため、このコードは正常に動作します。

関連する問題