2012-04-13 4 views
-1

Ich entwickle eine NFC-basierte Anwendung, in der wir die Daten von einem NFC-Gerät erhalten. Aber es funktioniert, wenn wir ein NFC-fähiges Android-Gerät neben NFC-Gerät bringen, dann erscheint ein Dialogfeld, in dem alle NFC-basierten Anwendungen aufgelistet sind. Also ist einer von ihnen auch mein. Wenn wir auf unser Anwendungssymbol in der Liste klicken, öffnet sich eine Aktivität aus meiner App (benannt als NfcActivity) und beginnt mit der Übertragung von Daten an das Android Phone , das ich nicht möchte. In dieser Aktivität gibt es zwei Schaltflächen auch Aktualisieren und Abbrechen. Ich möchte, wenn wir auf Update-Taste klicken, dann NFC-Gerät starten Übertragung von Daten an das Telefon mit einem Fortschrittsbalken und Wenn Daten vollständig übertragen werden dann automatisch Fortschrittsbalken abgewiesen. Ich kann dasselbe nicht tun, bitte schlagen Sie mir vor, wenn Sie Vorschläge dazu haben.Starten Sie die Übertragung von Daten vom NFC-Gerät auf Knopfdruck

Vielen Dank im Voraus.

NfcActivity:

package com.a1technology.impak; 


import java.io.IOException; 
import java.io.UnsupportedEncodingException; 
import java.math.BigInteger; 
import java.nio.ByteBuffer; 
import java.util.ArrayList; 
import java.util.Date; 
import java.util.List; 

import android.app.Activity; 
import android.app.AlertDialog; 
import android.app.PendingIntent; 
import android.content.ComponentName; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.content.Intent; 
import android.content.ServiceConnection; 
import android.nfc.NfcAdapter; 
import android.nfc.tech.IsoDep; 
import android.os.Bundle; 
import android.os.IBinder; 
import android.util.Log; 
import android.view.View; 
import android.widget.Toast; 

import com.a1technology.impak.db.DBAdapter; 
import com.cypak.mobile.bridge.android.CypakDevice; 
import com.cypak.mobile.bridge.android.CypakDeviceListener; 
import com.cypak.mobile.bridge.android.NfcTransportService; 
import com.cypak.mobile.bridge.android.TransportBinder; 



public class NfcActivity extends Activity implements CypakDeviceListener { 

    private boolean update = false; 

    private String TAG = "NfcExampleActivity"; 

    List<EventByteGetSet> eventList = new ArrayList<EventByteGetSet>(); 

    // Required for foreground dispatch 
    private String[][] techListsArray = new String[][] { new String[] { IsoDep.class.getName() } }; 

    private NfcAdapter mAdapter; 

    private PendingIntent pendingIntent; 

    // Required when binding to NfcTransportService 
    private NfcTransportService mService; 

    private boolean bound = false; 


    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.nfc_activity); 

     findViewById(R.id.cancel_button).setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 

       finish(); 
      } 
     }); 
     findViewById(R.id.update_button).setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 

       update = true; 
      } 
     }); 
     // Required for foreground dispatch 
     pendingIntent = PendingIntent.getActivity(getApplicationContext(), 0, new Intent(getApplicationContext(), NfcActivity.class).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0); 
     mAdapter = NfcAdapter.getDefaultAdapter(getApplicationContext());// Connecting 
               // to 
               // the 
               // adapter 

     resolveIntent(getIntent()); 

     Intent intent = new Intent(this, NfcTransportService.class); 
     // Bind to the service 
     if (!bindService(intent, mConnection, Context.BIND_AUTO_CREATE)) { 
      Log.e(TAG, "Failed to bind service"); 
     } 
    } 


    @Override 
    protected void onPause() { 

     super.onPause(); 
     // finish(); 
     // Required for foreground dispatch 
     mAdapter.disableForegroundDispatch(this); 

    } 


    @Override 
    protected void onDestroy() { 

     super.onDestroy(); 

     if (bound) { 
      unbindService(mConnection); 
      bound = false; 
     } 
    } 


    @Override 
    protected void onResume() { 

     super.onResume(); 

     // Required for foreground dispatch 
     mAdapter.enableForegroundDispatch(this, pendingIntent, null, techListsArray); 
    } 


    @Override 
    protected void onNewIntent(Intent intent) { 

     super.onNewIntent(intent); 
     setIntent(intent); 
     resolveIntent(intent); 
    } 


    private void resolveIntent(Intent intent) { 

     if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(intent.getAction())// need 
               // to 
               // find 
               // what 
               // action 
               // is 
               // coming 
      && mService != null) { 
      // Let NfcTransportService handle the Nfc Intent 
      try { 
       mService.handleIntent(intent); 
      } 
      catch (IOException e) { 
       Log.w(TAG, "Failed to detect device", e); 
      } 

     } 
    } 

    /** 
    * Defines callbacks for service binding, passed to bindService(). Only 
    * needed if binding to MyMaxTransportService 
    * */ 
    private ServiceConnection mConnection = new ServiceConnection() { 

     @Override 
     public void onServiceConnected(ComponentName className, IBinder service) { 

      // We've bound to NfcTransportService, cast the IBinder and 
      // get NfcTransportService instance 
      Log.v(TAG, "Service connected"); 
      TransportBinder binder = (TransportBinder) service; 
      mService = (NfcTransportService) binder.getService(); 
      bound = true; 

      mService.registerDeviceListener(NfcActivity.this); 
     } 


     @Override 
     public void onServiceDisconnected(ComponentName name) { 

      Log.v(TAG, "Service disconnected"); 
      bound = false; 
     } 
    }; 


    @Override 
    public void deviceDiscovered(CypakDevice device) { 

     // String hex = "1"; 
     // byte[] byteClear= hex.getBytes(); 
     // 

     if (!update) { 
      return; 
     } 
     else 
      try { 
       // byte[] byteData= device.sendAppCommand((byte) 
       // 0x11, byteClear); 
       NFCDataHandler mNfcDataHandler = new NFCDataHandler(this); 
       byte[] byteStatusData = device.sendAppCommand((byte) 0x00, new byte[0]); 
       String stateHCC = mNfcDataHandler.getStatus(byteStatusData); 
       if (stateHCC.equalsIgnoreCase("04")) { 
        byte[] byteQueLogData = device.sendAppCommand((byte) 0x05, new byte[0]); 
        if (byteQueLogData.length < 6) { 
         ShowMessage("Warning", "Card is Empty"); 
         return; 
        } 
        mNfcDataHandler.getQueLog(byteQueLogData); 
       } 
       else { 
        ShowMessage("Warning", "Card is not Active"); 
        return; 

       } 

       Log.v("Value", ""); 
      } 
      catch (com.cypak.mobile.bridge.android.AppCommandErrorCodeException e) { 
       Log.e(TAG, "AppCommandErrorCodeException, error code " + e.getErrorCode(), e); 
      } 
      catch (com.cypak.mobile.bridge.android.AppCommandException e) { 
       Log.e(TAG, "AppCommandException", e); 
      } 
      catch (IllegalArgumentException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

     // Toast.makeText(getApplicationContext(), "Device found! " + 
     // device, Toast.LENGTH_LONG).show(); 
    } 


    @Override 
    public void invalidDeviceDiscovered(CypakDevice device) { 

     Toast.makeText(getApplicationContext(), "Invalid device!", Toast.LENGTH_SHORT).show(); 
    } 


    @Override 
    public void deviceLost() { 

     Toast.makeText(getApplicationContext(), "Device lost!", Toast.LENGTH_SHORT).show(); 
    } 


    protected Date dateFromlongBuffer(long bb) { 

     return new Date((long) 1000 * (long) bb); 
    } 


    protected Date dateFromByteBuffer(ByteBuffer bb) { 

     return new Date((long) 1000 * (long) bb.getInt()); 
    } 

    static final byte[] HEX_CHAR_TABLE = { (byte) '0', (byte) '1', (byte) '2', (byte) '3', (byte) '4', (byte) '5', (byte) '6', (byte) '7', (byte) '8', (byte) '9', (byte) 'a', (byte) 'b', 
      (byte) 'c', (byte) 'd', (byte) 'e', (byte) 'f' }; 


    public static String getHexString(byte[] raw) throws UnsupportedEncodingException { 

     byte[] hex = new byte[2 * raw.length]; 
     int index = 0; 

     for (byte b : raw) { 
      int v = b & 0xFF; 
      hex[index++] = HEX_CHAR_TABLE[v >>> 4]; 
      hex[index++] = HEX_CHAR_TABLE[v & 0xF]; 
     } 
     return new String(hex, "ASCII"); 
    } 


    public static int hex2decimal(String s) { 

     String digits = "ABCDEF"; 
     s = s.toUpperCase(); 
     int val = 0; 
     for (int i = 0; i < s.length(); i++) { 
      char c = s.charAt(i); 
      int d = digits.indexOf(c); 
      val = 16 * val + d; 
     } 
     return val; 
    } 


    private void ShowMessage(String title, String message) { 

     AlertDialog.Builder b = new AlertDialog.Builder(this); 
     AlertDialog a = b.create(); 
     a.setTitle(title); 
     a.setMessage(message); 
     a.setButton("Ok", new DialogInterface.OnClickListener() { 

      public void onClick(DialogInterface arg0, int arg1) { 

       finish(); 
      } 
     }); 

     a.show(); 
    } 
} 

Antwort

0

Es sieht aus wie Sie resolveIntent() in onCreate() anrufen. Wenn Sie Ihre App aus der App-Auswahl auswählen, wird die NFC Discovered Intent an Ihre Activity über onCreate() weitergeleitet, und ich nehme an, Sie behandeln es sofort, wenn Sie mService.handleIntent(intent); anrufen. Jedes Mal, wenn Ihre App von der NFC-Erkennung gestartet wird, leiten Sie die Absicht sofort an Ihre Service weiter. Von Ihrer Frage scheint es, als ob Sie die NFC-Daten aus dem Intent erhalten möchten, wenn Sie es erhalten, speichern Sie das, und rufen Sie dann Ihren Dienst auf, wenn die Schaltfläche Aktualisieren gedrückt wird.

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.nfc_activity); 

    findViewById(R.id.cancel_button).setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View arg0) { 

      finish(); 
     } 
    }); 
    findViewById(R.id.update_button).setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View arg0) { 

      update = true; 
     } 
    }); 
    // Required for foreground dispatch 
    pendingIntent = PendingIntent.getActivity(getApplicationContext(), 0, new Intent(getApplicationContext(), NfcActivity.class).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0); 
    mAdapter = NfcAdapter.getDefaultAdapter(getApplicationContext());// Connecting 
              // to 
              // the 
              // adapter 
    // HERE, this could be the Intent from the NFC Discovery 
    **resolveIntent(getIntent());** 

    Intent intent = new Intent(this, NfcTransportService.class); 
    // Bind to the service 
    if (!bindService(intent, mConnection, Context.BIND_AUTO_CREATE)) { 
     Log.e(TAG, "Failed to bind service"); 
    } 
} 

so werden Sie schließlich die NFC-off auf der Service-Intent sofort vorbei:

private void resolveIntent(Intent intent) { 

    if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(intent.getAction())// need 
              // to 
              // find 
              // what 
              // action 
              // is 
              // coming 
     && mService != null) { 
     // Let NfcTransportService handle the Nfc Intent 
     try { 
      // HERE: you are handling the NFC Intent via onCreate() 
      mService.handleIntent(intent); 
     } 
     catch (IOException e) { 
      Log.w(TAG, "Failed to detect device", e); 
     } 

    } 
} 

nicht tun Sie warten wollen, bis der Benutzer auf die Schaltfläche vor Ihrer Callback-Methode klickt, wird deviceDiscovered() genannt ?

+0

Können Sie bitte Ihre Antwort ausarbeiten? –

+0

vielleicht sollten Sie den Service-Code enthalten? – sethro

+0

Welcher Servicecode? –

Verwandte Themen