2013-03-15 3 views
0

앱을 읽은 다음 코드가 말하는 내용을 말해달라고 요청했지만 이제는 문자열을 바코드로 인코딩하여 이미지로 표시하려고합니다. 화면에. 그러나 앱을 시작하기 전에 앱을 강제 종료합니다. 여기 내 코드는 도움이됩니다 :내 바코드 앱이 실행될 때마다 강제로 닫습니다.

import java.util.EnumMap; 
import java.util.Map; 

import android.os.Bundle; 
import android.app.ActionBar.LayoutParams; 
import android.app.Activity; 
import android.app.AlertDialog; 
import android.content.Intent; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.graphics.drawable.BitmapDrawable; 
import android.view.Gravity; 
import android.view.Menu; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 
import android.view.View; 
import android.widget.Button; 
import android.widget.ImageView; 
import android.widget.LinearLayout; 
import android.widget.TextView; 
import android.widget.Toast; 
import com.google.zxing.BarcodeFormat; 
import com.google.zxing.EncodeHintType; 
import com.google.zxing.MultiFormatWriter; 
import com.google.zxing.WriterException; 
import com.google.zxing.common.BitMatrix; 

public class Main extends Activity { 

IntentIntegrator integrator = new IntentIntegrator(this); 

private static final int WHITE = 0xFFFFFFFF; 
private static final int BLACK = 0xFF000000; 
LinearLayout myLayout = (LinearLayout)findViewById(R.id.myLayout); 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    //LinearLayout myLayout = (LinearLayout)findViewById(R.id.myLayout); 

    Button btn =(Button)findViewById(R.id.button1); 
    btn.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      integrator.initiateScan(); 
     } 
    }); 
} 
public void onActivityResult(int requestCode, int resultCode, Intent intent) { 
     IntentResult scanResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, intent); 
     if (scanResult != null) { 
      Toast.makeText(Main.this, 
        "works", 
        Toast.LENGTH_SHORT).show(); 
      String contents = intent.getStringExtra("SCAN_RESULT"); 
      String format = intent.getStringExtra("SCAN_RESULT_FORMAT"); 
      Toast.makeText(Main.this, 
        contents, 
        Toast.LENGTH_SHORT).show(); 
      Bitmap bitmap = null; 
      ImageView iv = new ImageView(this); 
      try { 

       bitmap = encodeAsBitmap(contents, BarcodeFormat.CODE_128, 600, 300); 
       iv.setImageBitmap(bitmap); 

      } catch (WriterException e) { 
       e.printStackTrace(); 
      } 
      myLayout.addView(iv); 
      TextView tv = new TextView(this); 
      tv.setGravity(Gravity.CENTER_HORIZONTAL); 
      tv.setText(contents); 

      myLayout.addView(tv); 
     } 


    } 
Bitmap encodeAsBitmap(String contents, BarcodeFormat format, int img_width, int img_height) throws WriterException { 
    String contentsToEncode = contents; 
    if (contentsToEncode == null) { 
     return null; 
    } 
    Map<EncodeHintType, Object> hints = null; 

     hints = new EnumMap<EncodeHintType, Object>(EncodeHintType.class); 
     hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); 

    MultiFormatWriter writer = new MultiFormatWriter(); 
    BitMatrix result; 
    try { 
     result = writer.encode(contentsToEncode, format, img_width, img_height, hints); 
    } catch (IllegalArgumentException iae) { 
     // Unsupported format 
     return null; 
    } 
    int width = result.getWidth(); 
    int height = result.getHeight(); 
    int[] pixels = new int[width * height]; 
    for (int y = 0; y < height; y++) { 
     int offset = y * width; 
     for (int x = 0; x < width; x++) { 
     pixels[offset + x] = result.get(x, y) ? BLACK : WHITE; 
     } 
    } 
    Bitmap bitmap = Bitmap.createBitmap(width, height, 
      Bitmap.Config.ARGB_8888); 
     bitmap.setPixels(pixels, 0, width, 0, 0, width, height); 
     return bitmap; 

} 
@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 

} 

IntentResult 및 IntentIntegrator는 모두 ZXing에서 가져온 것입니다.

로그인 고양이 :

03-15 13:05:04.303: E/AndroidRuntime(4363): FATAL EXCEPTION: main 
+1

더 많은 logcat을 게시 할 수 있습니까? – ianhanniballake

+0

bez 활동에 대한 setContentView를 설정하기 전에 레이아웃을 찾으려고합니다. 내가 왜 onCreate 안에 레이아웃 라인을 주석달라고하지 않습니까? –

+0

그런 다음 사용되는 유일한 시간은 onCreate 외부의 onActivityResult – Corey

답변

0

봅니다이 이동 :

LinearLayout myLayout = (LinearLayout)findViewById(R.id.myLayout); 

아래 :

setContentView(R.layout.main); 
+0

으로 변경하십시오 그러면 myLayout이 onActivityResult에서 사용될 때 문제가 발생하지 않습니까? – Corey

+0

아니요, onActivityResult에 어떤 오류가 있습니까? –

+0

myLayout을 해결할 수 없습니다. – Corey

0

토스트에서 대신 Main.this 당신은 getApplicationContext()을 시도해야합니다. 또한 ActivityContext 유형입니다.

+0

그건 내가 바코드 이미지를 만들기 전에 시도했기 때문에 문제가되지 않습니다. – Corey

관련 문제