2012-09-12 57 views
1

我在这里有一个非常具体的问题。我写了一个应用程序来发送消息给NFC芯片,但是当我按下按钮时它会一直崩溃。我使用的编辑器Eclipse没有提供任何错误或警告,因此它不是代码中的错误。自定义NFC应用不断崩溃

我觉得非常非常奇怪的是,尽管包含所有代码的try/catch块,它仍然崩溃。其中,如果NFC已启用的作品就好了,但在按“写”它启动和检查的部分只是使应用程序崩溃:

应用标签写入器(过程com.harold.tag.writer)意外停止。

你们能帮助我吗?

如果您需要任何其他信息,请询问。

package com.harold.tag.writer; 

import java.util.Locale; 

import android.app.Activity; 
import android.content.Intent; 
import android.nfc.NdefMessage; 
import android.nfc.NdefRecord; 
import android.nfc.NfcAdapter; 
import android.nfc.Tag; 
import android.nfc.tech.Ndef; 
import android.nfc.tech.NdefFormatable; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.Toast; 

import com.google.common.base.Charsets; 
import com.google.common.primitives.Bytes; 

public class Main extends Activity implements OnClickListener { 

EditText etUser; 
Button bWrite; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 


    initialise(); 
} 

private void initialise(){ 

    nfcsettings(); 

    etUser = (EditText)findViewById(R.id.etTag); 
    bWrite = (Button)findViewById(R.id.bWrite); 

    bWrite.setOnClickListener(this); 

} 

public void onClick(View v) { 
    try 
    { 
     //initialize nfc part 
     nfcsettings(); 
     Intent intent = this.getIntent(); 
     Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); 
     writeTag(tag); 
    } 
    catch (Exception e){ 
     Toast.makeText(getBaseContext(), "Button clicking", Toast.LENGTH_SHORT).show(); 
    } 
} 

private void writeTag(Tag tag){ 
    try 
    { 
    nfcsettings(); 
    Locale locale = Locale.ROOT; 
    final byte[] langBytes = locale.getLanguage().getBytes(Charsets.US_ASCII); 
    final byte[] textBytes = etUser.toString().getBytes(Charsets.UTF_8); 
    final int utfBit = 0; 
    final char status = (char)(utfBit + langBytes.length); 
    final byte[] data = Bytes.concat(new byte[] {(byte) status}, langBytes, textBytes); 
    NdefRecord record = new NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_TEXT, new byte[0], data); 


     NdefRecord[] records = {record}; 
     NdefMessage message = new NdefMessage(records); 
     Ndef ndef = Ndef.get(tag); 
     if (ndef != null) { 
      ndef.connect(); 
      ndef.writeNdefMessage(message); 
     } else { 
      NdefFormatable format = NdefFormatable.get(tag); 
      if (format != null) { 
       format.connect(); 
       format.format(message); 
      }   
     } 
    } 
    catch (Exception e) 
    { 
     //Display toast when there is a write error 
     Toast.makeText(getBaseContext(), "Tag write unsuccessful.", Toast.LENGTH_SHORT).show(); 
    } 
} 

private void nfcsettings(){ 

    if(!NfcAdapter.getDefaultAdapter(this).isEnabled()){ 
     Toast.makeText(getApplicationContext(), "Please activate NFC and press Back to return to the application!", Toast.LENGTH_LONG).show(); 
     startActivity(new Intent(android.provider.Settings.ACTION_WIRELESS_SETTINGS)); 
    } 
} 
} 

编辑:我发现我的问题就出在这几行:

import com.google.common.base.Charsets; 
import com.google.common.primitives.Bytes; 

上面提到的进口显然不符合该应用的其他部分一起导出。我在我的构建路径中包含Guava 9,但这并不能解决问题......我如何在应用中包含字符集和字节导入?

编辑:求助!

原来,将guavalib.jar文件从默认的android-sdk添加到我的项目的lib文件夹中就行。

+0

有没有Logcat错误? – Neil

+0

显然,是的,有...我刚刚在我的测试设备上安装了aLogCat,事实证明:我从Guava借用的Charset和Bytes不会与应用程序一起导出 - 下一个问题:我该如何做到这一点? –

+0

尝试将这些罐子添加到'libs'文件夹(如果您还没有这样做)。 – martijno

回答

0

原来,将guavalib.jar文件从默认的android-sdk文件添加到我的项目的lib文件夹中就行。