2017-07-05 4 views
0

こんにちは皆私はQRコードをスキャンするアプリを作成しようとしています。アンドロイド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); 
       } 
      }); 
     } 
    } 
}} 

しかし、私は結果でアプリをテストしようとすると、私は結果を見ることができません。

どういうところが間違っていますか?

は、データの検索がのonCreateメソッドであるべき結果アクティビティでみんな

+0

puあなたが情報を渡したいと思っているアクティビティの意図の中のエクストラ –

答えて

1

に感謝し、ないonActivityResultで、あなたの結果クラスは次のようになります。

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

前にする必要があります

後、次のようにありません:あなたは開始アクティビティと呼ばれる活動からの結果を返すことにしたい場合は

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

ありがとう! :) – simone

+0

コードは正常に動作しましたが、QRコードをスキャンすると結果アクティビティが1回だけ読み込まれます。どうして? – simone

+0

メソッドreceiveDetectionsが何回呼び出されたかを調べる – Alex

0

あなただけstartActivityForResultを使用しています。あなたのケースでは、startActivityを呼び出して結果アクティビティを開始し、getIntentを使用して結果アクティビティのデータを取得してください。

0

あなたのMainActivityに

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

を書いたコードは実際に、それは次のようにあるべきと

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

とResultActivityのonCreate(にあなたのMainActivityから結果を取得するためにActivityForResultしないでください間違っています)メソッドで結果を表示する場合は、次のコードを使用します。

TextView YourResult 
YourResult = (TextView) findViewById(R.id.TextView_YourResult); 
    final Barcode barcode = getIntent().getParcelableExtra("barcode"); 
    result.setText(barcode.displayValue); 
関連する問題