I have made an NFC tag writing app that has various options such as writing text,URL,toggle Wifi, Business Card etc.
The problem i am facing is when i click the write button after entering text. The app terminates on itself.
May be i am calling the wrong method.
当用户从列表中选择“写入URL”时,我希望这样。然后写入URL活动应该开始,并在按下写入按钮时写入标记。现在,当我按下写标签按钮。该应用程序说“不幸的是应用程序已停止。”
ListDisplay
package com.example.jordjr.projectwork;
import android.content.Intent;
import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
public class ListDisplay extends Activity implements AdapterView.OnItemClickListener {
// Array of strings...
ListView listview;
String[] mobileArray = {"Text", "URL", "Email", "Phone Number", "Wifi", "Business Card"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list);
ArrayAdapter adapter = new ArrayAdapter<String>(this, R.layout.activity_listview, mobileArray);
listview = (ListView) findViewById(R.id.mobile_list);
listview.setAdapter(adapter);
listview.setOnItemClickListener(this);
}
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
String item = ((TextView) view).getText().toString();
if(item.equalsIgnoreCase("text")){
Intent intent=new Intent (this,WriteUrl.class);
startActivity(intent);
}
else
if(item.equalsIgnoreCase("Phone Number")){
Intent intent=new Intent (this,PhoneNumber.class);
startActivity(intent);
}
else
if(item.equalsIgnoreCase("URL")) {
Intent intent = new Intent(this, WriteUrl.class);
startActivity(intent);
}
else
if(item.equalsIgnoreCase("Wifi")) {
Intent intent = new Intent(this,Wifi.class);
startActivity(intent);
}
else
if(item.equalsIgnoreCase("Email")) {
Intent intent = new Intent(this,WriteEmail.class);
startActivity(intent);
}
else
if(item.equalsIgnoreCase("Business Card")) {
Intent intent = new Intent(this, BusinessCard.class);
startActivity(intent);
}
}
}
写网址 package com.example.jordjr.projectwork;
import android.app.PendingIntent;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.Uri;
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.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class WriteUrl extends AppCompatActivity {
NfcAdapter nfcAdapter;
Button button;
EditText txtTagContent;
int x=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_write_url);
nfcAdapter=NfcAdapter.getDefaultAdapter(this);
button = (Button)findViewById(R.id.button);
txtTagContent = (EditText)findViewById(R.id.txtTagContent);
}
@Override
protected void onResume() {
super.onResume();
enableForegroundDispatchSystem();
}
@Override
protected void onPause() {
super.onPause();
disableForegroundDispatchSystem();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
private void enableForegroundDispatchSystem()
{
Intent intent=new Intent(this, MainActivity.class).addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
IntentFilter[] intentFilters = new IntentFilter[] {};
nfcAdapter.enableForegroundDispatch(this, pendingIntent, intentFilters, null);
}
private void disableForegroundDispatchSystem()
{
nfcAdapter.disableForegroundDispatch(this);
}
private void formatTag(Tag tag,NdefMessage ndefMessage)
{
try
{
NdefFormatable ndefFormatable=NdefFormatable.get(tag);
if(ndefFormatable == null)
{
Toast.makeText(this, "This Tag is Not ndef Formatable!", Toast.LENGTH_SHORT).show();
}
ndefFormatable.connect();
ndefFormatable.format(ndefMessage);
ndefFormatable.close();
Toast.makeText(this, "Tag written", Toast.LENGTH_SHORT).show();
}
catch (Exception e)
{
Log.e("formatTag", e.getMessage());
}
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
if (x == 1) {
if (intent.hasExtra(NfcAdapter.EXTRA_TAG)) {
Toast.makeText(this, "NfcIntent!", Toast.LENGTH_SHORT).show();
Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
NdefMessage ndefMessage = createNdefMessage(txtTagContent.getText() + "");
writeNdefMessage(tag, ndefMessage);
}
x=0;
}
}
private void writeNdefMessage(Tag tag, NdefMessage ndefMessage)
{
try
{
if(tag == null)
{
Toast.makeText(this, "Tag object cannot be null", Toast.LENGTH_SHORT).show();
return;
}
Ndef ndef = Ndef.get(tag);
if(ndef == null)
{
//formats tag with the ndef format and writes the message
formatTag(tag, ndefMessage);
}
else
{
ndef.connect();
if(!ndef.isWritable())
{
Toast.makeText(this, "Tag is not writable!", Toast.LENGTH_SHORT).show();
ndef.close();
return;
}
ndef.writeNdefMessage(ndefMessage);
ndef.close();
Toast.makeText(this, "Tag written", Toast.LENGTH_SHORT).show();
}
}
catch(Exception e)
{
Log.e("writeNdefMessage", e.getMessage());
}
}
private NdefMessage createNdefMessage(String content)
{
NdefRecord ndefRecord = createUrlRecord(content);
NdefMessage ndefMessage=new NdefMessage(new NdefRecord[] {ndefRecord});
return ndefMessage;
}
private NdefRecord createUrlRecord(String content)
{
try {
Uri uri = Uri.parse("http://" + content);
NdefRecord ndefRecord = NdefRecord.createUri(uri);
return ndefRecord;
}
catch(Exception e)
{
Log.e("create Ndef Record", e.getMessage());
return null;
}
}
public void writeUri(View view) {
Toast.makeText(this, "Bring forth thy nfc tag", Toast.LENGTH_SHORT).show();
x=1;
}
}
xml文件
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingRight="16dp"
android:paddingTop="16dp"
android:paddingBottom="16dp"
android:paddingLeft="16dp"
tools:context="com.example.jordjr.projectwork.WriteUrl">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/button"
android:text="WRITE URL"
android:checked="true"
android:onClick="writeUri"
/>
<EditText
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:id="@+id/txtTagContent"
android:layout_gravity="top"
android:height="40dp"
android:width="320dp"
android:text="Enter Here"
enter code here
/>
</RelativeLayout>
答案 0 :(得分:0)
我无法发表评论。您是否在清单中声明了所有活动?像:
<activity
android:name=".WriteUrl">
</activity>
<activity
android:name=".PhoneNumber">
</activity>
......等等?
按下按钮&#34;写&#34;一项新活动已经开始。如果未宣布该活动,那么应用程序肯定会粉碎并显示消息&#34;不幸的是该应用程序已停止。&#34;。