簡體   English   中英

ANDROID如何在掃描QR碼后在新的活動中發送結果?

[英]ANDROID How can I send result in a new Activity after scanning a QR Code?

大家好,我正在嘗試創建一個掃描QR碼的應用。

在主要活動中,我想掃描QR碼,然后將結果發送到新的活動中。

這是我的代碼

主要Activity.java:

public class MainActivity extends AppCompatActivity {

SurfaceView cameraView;
BarcodeDetector barcode;
CameraSource cameraSource;
SurfaceHolder holder;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED){
        ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.CAMERA}, 200);
    }




    cameraView = (SurfaceView) findViewById(R.id.cameraView);
    cameraView.setZOrderMediaOverlay(true);
    holder = cameraView.getHolder();
    barcode = new BarcodeDetector.Builder(this)
            .setBarcodeFormats(Barcode.QR_CODE)
            .build();
    if(!barcode.isOperational()){
        Toast.makeText(getApplicationContext(), "Sorry, Couldn't setup the detector", Toast.LENGTH_LONG).show();
        this.finish();
    }
    cameraSource = new CameraSource.Builder(this, barcode)
            .setFacing(CameraSource.CAMERA_FACING_BACK)
            .setRequestedFps(24)
            .setAutoFocusEnabled(true)
            .setRequestedPreviewSize(1920,1024)
            .build();
    cameraView.getHolder().addCallback(new SurfaceHolder.Callback() {
        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            try{
                if(ContextCompat.checkSelfPermission(MainActivity.this, android.Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED){
                    cameraSource.start(cameraView.getHolder());
                }
            }
            catch (IOException e){
                e.printStackTrace();
            }
        }

        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

        }

        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {

        }
    });
    barcode.setProcessor(new Detector.Processor<Barcode>() {
        @Override
        public void release() {

        }

        @Override
        public void receiveDetections(Detector.Detections<Barcode> detections) {
            final SparseArray<Barcode> barcodes =  detections.getDetectedItems();
            if(barcodes.size() > 0){

                Intent intent = new Intent(MainActivity.this, Result.class);
                startActivityForResult(intent, 100);
                intent.putExtra("barcode", barcodes.valueAt(0));
                setResult(RESULT_OK, intent);
                finish();
            }
        }
    });
}}

Result.java:

public class Result extends AppCompatActivity {

TextView result;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_result);
    result = (TextView) findViewById(R.id.result);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if(requestCode == 100 && resultCode == RESULT_OK){
        if(data != null){
            final Barcode barcode = data.getParcelableExtra("barcode");
            result.post(new Runnable() {
                @Override
                public void run() {
                    result.setText(barcode.displayValue);
                }
            });
        }
    }
}}

但是,當我嘗試在結果活動中測試應用程序時,我看不到結果。

怎么了?

謝謝大家

在Result活動中,數據的檢索應在onCreate方法中,而不是在onActivityResult中,您的Result類應如下所示:

public class Result extends AppCompatActivity {
    TextView result;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_result);
        result = (TextView) findViewById(R.id.result);
        final Barcode barcode = getIntent().getParcelableExtra("barcode");
        result.setText(barcode.displayValue);
    }
}

在MainActivity中,此行:

intent.putExtra("barcode", barcodes.valueAt(0)); 

應該在之前

startActivityForResult(intent, 100); 

不像這樣:

Intent intent = new Intent(MainActivity.this, Result.class); 
intent.putExtra("barcode", barcodes.valueAt(0)); 
startActivityForResult(intent, 100); 
finish(); 

僅當您要返回啟動活動以及被調用活動的結果時,才使用startActivityForResult 在您的情況下,只需調用startActivity啟動結果活動,然后使用getIntent獲取結果活動中的數據。

您在MainActivity中編寫的代碼

Intent intent = new Intent(MainActivity.this, Result.class);
            startActivityForResult(intent, 100);
            intent.putExtra("barcode", barcodes.valueAt(0));
            setResult(RESULT_OK, intent);
            finish();

是錯誤的實際上應該如下所示,請不要ActivityForResult

Intent intent = new Intent(MainActivity.this, Result.class);
            intent.putExtra("barcode", barcodes.valueAt(0));
            startActivityForResult(intent, 100);
            finish();

為了在ResultActivity onCreate()方法中從MainActivity獲取結果,請使用以下代碼(如果要顯示結果)

TextView YourResult
YourResult = (TextView) findViewById(R.id.TextView_YourResult);
    final Barcode barcode = getIntent().getParcelableExtra("barcode");
    result.setText(barcode.displayValue);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM