0

I am creating new project based on old project from github.Here is link to my project. It is NFC based project which uses NFC tags to write data and then perform action on it like pause/play music, send sms etc.

What changes I have made

  1. Create new Project with new application name and package name
  2. Copy Java, resource files(XML,icons etc) with folder into new project
  3. Change package name in java files as they were based on old package name from old project
  4. Change application name/package name where ever required like in androidmanifest files etc.
  5. No gradle or build files were copied, only java and resource files were copied into new project
  6. Kept all configuration same as old project

New project crashes while writing data for pause/play music. I am completely new to Android and Android studio as well.

Old project works perfectly but new project crashes at one point. I am using Nexus 4 running 5.0.1. Old project works perfectly fine but new project crashes when used

I have marked error lines with comments big enough to notice it.

Sorry for my bad english

This is writeractivity.java

package nfc.sidharthchaudhari.com.nfctrigger.writers;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.PendingIntent;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
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.util.Log;
import android.widget.Toast;

import java.io.IOException;
import java.nio.charset.Charset;

/**
 * Abstract class that all activities that write to a tag extend.
 */
public abstract class WriterActivity extends Activity {

    /**
     * MIME-types for custom activities to be activated
     * when tag is tapped.
     */
    public static final String PREV = "application/c23";
    public static final String NEXT = "application/c22";
    public static final String TOGGLE = "application/c24";
    public static final String CALL = "application/c20";
    public static final String SMS = "application/c21";
    public static final String LAUNCH = "application/c25";


    private String m_mimeType;
    private boolean m_writeModeOn = false;
    private String[] m_payload;
    private String m_uriString;
    private AlertDialog m_ad; // "tap tag now"-type dialog

    protected NfcAdapter m_nfcAdapter;
    protected PendingIntent m_pendingIntent;
    protected IntentFilter[] m_writeTagFilters;
    protected Tag m_detectedTag;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        this.setUpLayout();

        m_nfcAdapter = NfcAdapter.getDefaultAdapter(this);

        m_pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this,
                getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);

        IntentFilter ndefIntent = new IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED);

        m_writeTagFilters = new IntentFilter[]{ndefIntent};

        this.setUpActivity();
    }

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

        if (m_nfcAdapter != null) {
            m_nfcAdapter.enableForegroundDispatch(this, m_pendingIntent, m_writeTagFilters, null);
        }
    }

    @Override
    public void onPause() {
        super.onPause();

        if (m_nfcAdapter != null) {
            m_nfcAdapter.disableForegroundDispatch(this);
        }
    }

    @Override
    public void onNewIntent(Intent intent) {
        super.onNewIntent(intent);

        performTagOps(intent);      //---------------------line 92------------//
        finish();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        if (m_ad != null) {
            m_ad.dismiss();
        }
    }

    /**
     * Creates the NDEF message to be written to tag
     * (either MIME or URI, with or without payload)
     * @param uriName name of URI to write on tag
     * @return an NDEF message
     */
    public NdefMessage createMessage(String uriName) {
        NdefRecord[] records;

        // MIME type
        if (uriName == null) {
            String mType = getMimeType();
            String[] pl = getPayload();
            if (pl != null) {
                records = new NdefRecord[pl.length];
                for (int i=0; i<pl.length; i++) {
                    byte[] plBytes = pl[i].getBytes(Charset.forName("UTF-8"));
                    records[i] = NdefRecord.createMime(mType, plBytes);
                }
            } else {
                records = new NdefRecord[1];
                records[0] = NdefRecord.createMime(mType, new byte[0]);
                if (mType.equals(TOGGLE) || mType.equals(NEXT) || mType.equals(PREV)) {
                    Intent intent = new Intent("android.intent.action.MUSIC_PLAYER");
                    startService(intent);                //---------------------line 128------------//
                }
            }
        } else { // URI
            if (uriName.isEmpty()) {
                Toast.makeText(getApplicationContext(), "URL is empty", Toast.LENGTH_LONG).show();
                return null;
            }
            Uri uri = Uri.parse(uriName);
            NdefRecord ndefRecord = NdefRecord.createUri(uri);
            records = new NdefRecord[] {ndefRecord};
        }

        return new NdefMessage(records);
    }

    /**
     * Writes intended message to tag
     * @param tag
     * @return true iff tag was written to successfully.
     */
    public boolean writeTag(Tag tag) {

        String uriName = getUriString();
        NdefMessage message = createMessage(uriName);    //---------------------line 152------------//
        if (message == null) {
            return false;
        }

        try {
            // see if tag is already NDEF formatted
            Ndef ndef = Ndef.get(tag);
            if (ndef != null) {
                ndef.connect();

                if (!ndef.isWritable()) {
                    Toast.makeText(getApplicationContext(), "Read-only tag",
                            Toast.LENGTH_LONG).show();
                    return false;
                }

                // figure out how much space we need
                int size = message.toByteArray().length;
                Log.d("msg size", String.valueOf(size));
                Log.d("tag size", String.valueOf(ndef.getMaxSize()));
                if (ndef.getMaxSize() < size) {
                    Toast.makeText(getApplicationContext(), "Not enough space on tag", Toast.LENGTH_LONG).show();
                    return false;
                }

                ndef.writeNdefMessage(message);
                Toast.makeText(getApplicationContext(), "Successfully written to tag", Toast.LENGTH_LONG).show();
                return true;
            } else {
                // try to format tag to NDEF
                NdefFormatable format = NdefFormatable.get(tag);
                if (format != null) {
                    try {
                        format.connect();
                        format.format(message);
                        Toast.makeText(getApplicationContext(), "Successfully written to tag", Toast.LENGTH_LONG).show();
                        return true;
                    } catch (IOException e) {
                        Toast.makeText(getApplicationContext(), "Unable to format to NDEF", Toast.LENGTH_LONG).show();
                        return false;
                    }
                } else {
                    Toast.makeText(getApplicationContext(), "Tag does not support NDEF", Toast.LENGTH_LONG).show();
                    return false;
                }
            }
        } catch (Exception e) {
            Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_LONG).show();
        }

        return false;
    }

    /**
     * Writes to tag if tag detected
     * @param intent
     */
    public void performTagOps(Intent intent) {

        if (intent.getAction().equals(NfcAdapter.ACTION_TAG_DISCOVERED)) {

            m_detectedTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
            if (m_detectedTag == null) {
                Toast.makeText(getApplicationContext(), "Tag not found.", Toast.LENGTH_LONG).show();
            } else {
                if (getWriteMode()) {
                    writeTag(m_detectedTag);     //---------------------line 219------------//
                }
                setWriteModeOff();
            }
        }
    }

    /**
     * @return String indicating the MIME-type
     */
    public String getMimeType() {
        return m_mimeType;
    }

    /**
     * Set the MIME-type
     * @param mimeType String indicating the MIME-type
     */
    public void setMimeType(String mimeType) {
        this.m_mimeType = mimeType;
    }

    /**
     * @return true iff write mode is on
     */
    public boolean getWriteMode() {
        return this.m_writeModeOn;
    }

    /**
     * Set write mode to on
     */
    public void setWriteModeOn() {
        this.m_writeModeOn = true;
    }

    /**
     * Set write mode to off
     */
    public void setWriteModeOff() {
        this.m_writeModeOn = false;
    }

    /**
     * Returns payload to be written to tag.
     * @return String[]
     */
    public String[] getPayload() {
        return this.m_payload;
    }

    /**
     * Set the payload to be written to tag.
     * @param payload String array which is the payload
     */
    public void setPayload(String[] payload) {
        this.m_payload = payload;
    }

    /**
     * Returns the URI to be written to tag.
     * @return String
     */
    public String getUriString() {
        return this.m_uriString;
    }

    /**
     * Set the URI to be written to tag.
     * @param uriString
     */
    public void setUriString(String uriString) {
        this.m_uriString = uriString;
    }

    /**
     * Shows the user a dialog which instructs to tap phone on tag.
     * @return the AlertDialog
     */
    public AlertDialog showDialog() {
        AlertDialog.Builder adb = new AlertDialog.Builder(this);
        adb.setTitle("Please bring NFC tag near to phone");
        adb.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                setWriteModeOff();
                dialog.dismiss();
            }
        }).setIcon(android.R.drawable.ic_dialog_alert);
        m_ad = adb.create();
        m_ad.show();
        return m_ad;
    }

    /**
     * Sets user preferences for UI text fields.
     * @param key String
     * @param value String
     */
    public void setPrefs(String key, String value) {
        PreferencesHelper prefHelper = new PreferencesHelper(getApplicationContext());
        prefHelper.savePreferences(key, value);
    }

    /**
     * Retrieves preferences for UI text fields.
     * @param key String
     * @return String, the value of the preference
     */
    public String getPrefs(String key) {
        PreferencesHelper prefHelper = new PreferencesHelper(getApplicationContext());
        return prefHelper.getPreferences(key);
    }

    /**
     * Set up the visual layout of the activity
     */
    public void setUpLayout() { }

    /**
     * Set up objects needed for the activity on the onCreate method of child classes.
     */
    public abstract void setUpActivity();
}

Error

04-12 12:20:22.722  31614-31614/nfc.sidharthchaudhari.com.nfctrigger E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: nfc.sidharthchaudhari.com.nfctrigger, PID: 31614
    java.lang.IllegalArgumentException: Service Intent must be explicit: Intent { act=android.intent.action.MUSIC_PLAYER }
            at android.app.ContextImpl.validateServiceIntent(ContextImpl.java:1674)
            at android.app.ContextImpl.startServiceCommon(ContextImpl.java:1703)
            at android.app.ContextImpl.startService(ContextImpl.java:1687)
            at android.content.ContextWrapper.startService(ContextWrapper.java:515)
            at nfc.sidharthchaudhari.com.nfctrigger.writers.WriterActivity.createMessage(WriterActivity.java:128)
            at nfc.sidharthchaudhari.com.nfctrigger.writers.WriterActivity.writeTag(WriterActivity.java:152)
            at nfc.sidharthchaudhari.com.nfctrigger.writers.WriterActivity.performTagOps(WriterActivity.java:219)
            at nfc.sidharthchaudhari.com.nfctrigger.writers.WriterActivity.onNewIntent(WriterActivity.java:92)
            at android.app.Instrumentation.callActivityOnNewIntent(Instrumentation.java:1210)
            at android.app.ActivityThread.deliverNewIntents(ActivityThread.java:2430)
            at android.app.ActivityThread.performNewIntents(ActivityThread.java:2443)
            at android.app.ActivityThread.handleNewIntent(ActivityThread.java:2452)
            at android.app.ActivityThread.access$1600(ActivityThread.java:144)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1350)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5221)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
Sam
  • 1,237
  • 1
  • 16
  • 29
  • possible duplicate of [Service Intent must be explicit: Intent](http://stackoverflow.com/questions/27842430/service-intent-must-be-explicit-intent) – user253751 Apr 12 '15 at 07:11
  • But old project having same code is working perfectly but this new one doesn't why? can you please tell me – Sam Apr 12 '15 at 07:21
  • Probably because it has a different API level setting. – user253751 Apr 12 '15 at 07:25
  • no, they both are same. Also i am running both projects on same device as well. I have made sure, all configuration remains same. – Sam Apr 12 '15 at 07:27
  • Really? What's the target API level (`targetSdkVersion` in the manifest) of each project? – user253751 Apr 12 '15 at 07:40
  • minimum 16 and maximum 19 in both projects. – Sam Apr 12 '15 at 07:41

0 Answers0