2013-03-15 53 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 2013-03-15 17:12:50

+0

貝茲你正試圖找到佈局之前設置setContentView爲活動。我不是爲什麼你在onCreate中評論佈局線? – 2013-03-15 17:12:54

+0

然後它說集成商沒有被使用,因爲它唯一使用的時間在onCreate以外,在onActivityResult – Corey 2013-03-15 17:27:14

回答

0

嘗試移動這樣的:

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

下:

setContentView(R.layout.main); 
+0

那麼在onActivityResult中使用myLayout時不會產生問題? – Corey 2013-03-15 17:24:44

+0

不,它不應該,onActivityResult會得到什麼錯誤? – 2013-03-15 17:31:21

+0

我得到myLayout無法解析... – Corey 2013-03-15 17:33:45

0

在祝酒詞,而不是Main.this你應該嘗試getApplicationContext()。還記得ActivityContext的一種。

+0

多數民衆贊成那不是問題,因爲我嘗試使條形碼圖像之前工作。 – Corey 2013-03-15 17:36:57