0

Ich versuche eine App zu entwickeln, die ein NFC-Tag liest und die gelesenen Daten anzeigt. Ich nahm den größten Teil des Codes von a blog, aber ich bekomme einen Fehler, wenn ich die Anwendung ausführen, da ich versuche, es mit der Slider-Anwendung zu integrieren.IllegalStateException (Bereits verbunden) beim Öffnen der NFC-Reader-App

Hier sind meine Fehler und meine Code unten:

E/AndroidRuntime: FATAL EXCEPTION: main 
        Process: com.example.jeffk11.tag, PID: 2
        java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.jeffk11.tag/com.example.jeffk11.tag.MainActivity}: java.lang.IllegalStateException: Already attached 
         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2665) 
         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726) 
         at android.app.ActivityThread.-wrap12(ActivityThread.java) 
         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477) 
         at android.os.Handler.dispatchMessage(Handler.java:102) 
         at android.os.Looper.loop(Looper.java:154) 
         at android.app.ActivityThread.main(ActivityThread.java:6119) 
         at java.lang.reflect.Method.invoke(Native Method) 
         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 
        Caused by: java.lang.IllegalStateException: Already attached 
         at android.support.v4.app.FragmentManagerImpl.attachController(FragmentManager.java:2137) 
         at android.support.v4.app.FragmentController.attachHost(FragmentController.java:104) 
         at android.support.v4.app.FragmentActivity.onCreate(FragmentActivity.java:317) 
         at android.support.v7.app.AppCompatActivity.onCreate(AppCompatActivity.java:88) 
         at com.example.jeffk11.tag.MainActivity.onCreate(MainActivity.java:68) 
         at android.app.Activity.performCreate(Activity.java:6679) 
         at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118) 
         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2618) 
         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726)  
         at android.app.ActivityThread.-wrap12(ActivityThread.java)  
         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477)  
         at android.os.Handler.dispatchMessage(Handler.java:102)  
         at android.os.Looper.loop(Looper.java:154)  
         at android.app.ActivityThread.main(ActivityThread.java:6119)  
         at java.lang.reflect.Method.invoke(Native Method)  
         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)  
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)  

Code:

package com.example.jeffk11.tag; 

import android.os.Bundle; 
import android.support.design.widget.FloatingActionButton; 
import android.support.design.widget.Snackbar; 
import android.view.View; 
import android.support.design.widget.NavigationView; 
import android.support.v4.view.GravityCompat; 
import android.support.v4.widget.DrawerLayout; 
import android.support.v7.app.ActionBarDrawerToggle; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.Toolbar; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.nfc.NfcAdapter; 
import android.widget.TextView; 
import android.widget.Toast; 
import android.content.Intent; 
import java.io.UnsupportedEncodingException; 
import java.util.Arrays; 
import android.app.Activity; 
import android.app.PendingIntent; 
import android.content.IntentFilter; 
import android.content.IntentFilter.MalformedMimeTypeException; 
import android.nfc.Tag; 
import android.nfc.tech.Ndef; 
import android.util.Log; 
import android.nfc.NdefRecord; 
import android.os.AsyncTask; 
import android.nfc.NdefMessage; 


public class MainActivity extends AppCompatActivity 
     implements NavigationView.OnNavigationItemSelectedListener { 


    private TextView mTextView; 
    private NfcAdapter mNfcAdapter; 
    public static final String MIME_TEXT_PLAIN = "text/plain"; 
    public static final String TAG = "NfcDemo"; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
     fab.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) 
         .setAction("Action", null).show(); 
      } 
     }); 

     DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
     ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
       this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); 
     drawer.setDrawerListener(toggle); 
     toggle.syncState(); 

     NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); 
     navigationView.setNavigationItemSelectedListener(this); 

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

     mTextView = (TextView) findViewById(R.id.textView_explanation); 

     mNfcAdapter = NfcAdapter.getDefaultAdapter(this); 

     if (mNfcAdapter == null) { 
      // Stop here, we definitely need NFC 
      Toast.makeText(this, "This device doesn't support NFC.", Toast.LENGTH_LONG).show(); 
      finish(); 
      return; 

     } 

     if (!mNfcAdapter.isEnabled()) { 
      mTextView.setText("NFC is disabled."); 
     } else { 
      mTextView.setText(R.string.explanation); 
     } 

     handleIntent(getIntent()); 
    } 

    private void handleIntent(Intent intent) { 
     String action = intent.getAction(); 
     if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)) { 

      String type = intent.getType(); 
      if (MIME_TEXT_PLAIN.equals(type)) { 

       Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); 
       new NdefReaderTask().execute(tag); 

      } else { 
       Log.d(TAG, "Wrong mime type: " + type); 
      } 
     } else if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(action)) { 

      // In case we would still use the Tech Discovered Intent 
      Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); 
      String[] techList = tag.getTechList(); 
      String searchedTech = Ndef.class.getName(); 

      for (String tech : techList) { 
       if (searchedTech.equals(tech)) { 
        new NdefReaderTask().execute(tag); 
        break; 
       } 
      } 

     } 
    } 

    @Override 
    public void onBackPressed() { 
     DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
     if (drawer.isDrawerOpen(GravityCompat.START)) { 
      drawer.closeDrawer(GravityCompat.START); 
     } else { 
      super.onBackPressed(); 
     } 
    } 

    @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; 
    } 

    @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); 
    } 

    @SuppressWarnings("StatementWithEmptyBody") 
    @Override 
    public boolean onNavigationItemSelected(MenuItem item) { 
     // Handle navigation view item clicks here. 
     int id = item.getItemId(); 

     if (id == R.id.nav_camera) { 
      // Handle the camera action 
     } else if (id == R.id.nav_gallery) { 

     } else if (id == R.id.nav_slideshow) { 

     } else if (id == R.id.nav_manage) { 

     } else if (id == R.id.nav_share) { 

     } else if (id == R.id.nav_send) { 

     } 

     DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
     drawer.closeDrawer(GravityCompat.START); 
     return true; 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 

     /** 
     * It's important, that the activity is in the foreground (resumed). Otherwise 
     * an IllegalStateException is thrown. 
     */ 
     setupForegroundDispatch(this, mNfcAdapter); 
    } 

    @Override 
    protected void onPause() { 
     /** 
     * Call this before onPause, otherwise an IllegalArgumentException is thrown as well. 
     */ 
     stopForegroundDispatch(this, mNfcAdapter); 

     super.onPause(); 
    } 

    @Override 
    protected void onNewIntent(Intent intent) { 
     /** 
     * This method gets called, when a new Intent gets associated with the current activity instance. 
     * Instead of creating a new activity, onNewIntent will be called. For more information have a look 
     * at the documentation. 
     * 
     * In our case this method gets called, when the user attaches a Tag to the device. 
     */ 
     handleIntent(intent); 
    } 

    /** 
    * @param activity The corresponding {@link Activity} requesting the foreground dispatch. 
    * @param adapter The {@link NfcAdapter} used for the foreground dispatch. 
    */ 
    public static void setupForegroundDispatch(final AppCompatActivity activity, NfcAdapter adapter) { 
     final Intent intent = new Intent(activity.getApplicationContext(), activity.getClass()); 
     intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 

     final PendingIntent pendingIntent = PendingIntent.getActivity(activity.getApplicationContext(), 0, intent, 0); 

     IntentFilter[] filters = new IntentFilter[1]; 
     String[][] techList = new String[][]{}; 

     // Notice that this is the same filter as in our manifest. 
     filters[0] = new IntentFilter(); 
     filters[0].addAction(NfcAdapter.ACTION_NDEF_DISCOVERED); 
     filters[0].addCategory(Intent.CATEGORY_DEFAULT); 
     try { 
      filters[0].addDataType(MIME_TEXT_PLAIN); 
     } catch (MalformedMimeTypeException e) { 
      throw new RuntimeException("Check your mime type."); 
     } 

     adapter.enableForegroundDispatch(activity, pendingIntent, filters, techList); 
    } 

    /** 
    * @param activity The corresponding {@link BaseActivity} requesting to stop the foreground dispatch. 
    * @param adapter The {@link NfcAdapter} used for the foreground dispatch. 
    */ 
    public static void stopForegroundDispatch(final AppCompatActivity activity, NfcAdapter adapter) { 
     adapter.disableForegroundDispatch(activity); 
    } 


    class NdefReaderTask extends AsyncTask<Tag, Void, String> { 

     @Override 
     protected String doInBackground(Tag... params) { 
      Tag tag = params[0]; 

      Ndef ndef = Ndef.get(tag); 
      if (ndef == null) { 
       // NDEF is not supported by this Tag. 
       return null; 
      } 

      NdefMessage ndefMessage = ndef.getCachedNdefMessage(); 

      NdefRecord[] records = ndefMessage.getRecords(); 
      for (NdefRecord ndefRecord : records) { 
       if (ndefRecord.getTnf() == NdefRecord.TNF_WELL_KNOWN && Arrays.equals(ndefRecord.getType(), NdefRecord.RTD_TEXT)) { 
        try { 
         return readText(ndefRecord); 
        } catch (UnsupportedEncodingException e) { 
         Log.e(TAG, "Unsupported Encoding", e); 
        } 
       } 
      } 

      return null; 
     } 

     private String readText(NdefRecord record) throws UnsupportedEncodingException { 
     /* 
     * See NFC forum specification for "Text Record Type Definition" at 3.2.1 
     * 
     * http://www.nfc-forum.org/specs/ 
     * 
     * bit_7 defines encoding 
     * bit_6 reserved for future use, must be 0 
     * bit_5..0 length of IANA language code 
     */ 

      byte[] payload = record.getPayload(); 

      // Get the Text Encoding 
      String textEncoding = ((payload[0] & 128) == 0) ? "UTF-8" : "UTF-16"; 

      // Get the Language Code 
      int languageCodeLength = payload[0] & 0063; 

      // String languageCode = new String(payload, 1, languageCodeLength, "US-ASCII"); 
      // e.g. "en" 

      // Get the Text 
      return new String(payload, languageCodeLength + 1, payload.length - languageCodeLength - 1, textEncoding); 
     } 

     @Override 
     protected void onPostExecute(String result) { 
      if (result != null) { 
       mTextView.setText("Read content: " + result); 
      } 
     } 
    } 
} 

Antwort

1

Sie rufen die onCreate Methode der Superklasse (AppCompatActivity) mehrere Male in Ihrem eigenen onCreate Methode. Tu das nicht. super.onCreate() muss nur einmal aufgerufen werden (in der Regel dieses onCreate Methode ist zu Beginn Ihrer Tätigkeit erfolgt. So einfach das zweite Auftreten von

entfernen
super.onCreate(savedInstanceState); 
setContentView(R.layout.activity_main); 
Verwandte Themen