意图过滤器不适用于Android Beam NFC

时间:2015-02-08 14:42:54

标签: android nfc intentfilter nfc-p2p android-beam

我确信这很简单,但我无法弄清楚。我所要做的就是通过NFC(android Beam)发送消息并在接收设备上打开我的应用程序。我确实在一个新项目上测试了我的代码并且它运行得很好但是如果我在我的真实项目上尝试它就会开始"收集新标签"并显示application / eu.freemoser.mydebts2go(参见my screenshot)。我不知道清单上有什么错误可能吗?谷歌的结果与我的问题不匹配(或者我只是为了愚蠢),但我相信我发现了一些related answer,但遗憾的是我还是无法解决我的问题

我的宣言:

<?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="eu.freemoser.myDebts2go"
        android:versionCode="16"

        android:versionName="1.1.0">

        <uses-permission android:name="android.permission.GET_ACCOUNTS" />
        <uses-permission android:name="android.permission.READ_CONTACTS" />
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.NFC" />
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
        <uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" />
        <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
        <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
        <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
        <uses-permission android:name="com.android.alarm.permission.SET_ALARM" />

        <uses-feature android:name="android.hardware.nfc" android:required="false" />
        <uses-feature android:name="android.hardware.camera" />



        <uses-sdk
            android:minSdkVersion="16"
            android:targetSdkVersion="19" />
        <uses-feature
            android:glEsVersion="0x00020000"
            android:required="true" />

        <application
            android:name="eu.freemoser.myDebts2go.MyApplication"
            android:allowBackup="true"
            android:hardwareAccelerated="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/Theme.Mydebts2go">
            >


            <service android:name="eu.freemoser.myDebts2goService.NotificationService"></service>
            <service android:name="eu.freemoser.myDebts2goService.SynchronizationService"></service>
            <service android:name="eu.freemoser.myDebts2goService.SynchronizService"></service>
            <service android:name="eu.freemoser.myDebts2goService.AwesomeSynchronizService"></service>


            <activity
                android:name="eu.freemoser.myDebts2go.MainActivity"
                android:label="@string/app_name"
                android:screenOrientation="portrait">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>


            <activity
           android:name="eu.freemoser.myDebts2GoActivities.AwesomeDetailActivity"
                android:screenOrientation="portrait" android:theme="@style/Theme.MyDebts2GO.Detail">
            </activity>

            <activity android:name=".AndroidBeamActivity" android:screenOrientation="portrait"
                android:theme="@android:style/Theme.DeviceDefault.Wallpaper.NoTitleBar">
                <intent-filter>
                    <action android:name="android.nfc.action.NDEF_DISCOVERED" />
                    <category android:name="android.intent.category.DEFAULT" />
                    <data android:mimeType="application/eu.freemoser.myDebts2go" />
                </intent-filter>
            </activity>

            <activity android:name="eu.freemoser.myDebts2GoActivities.DriveRestoreActivity"></activity>
            <activity android:name="eu.freemoser.myDebts2GoActivities.SynchronizActivity"></activity>

            <activity android:name="eu.freemoser.myDebts2GoActivities.SettingActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MANAGE_NETWORK_USAGE" />
                    <category android:name="android.intent.category.DEFAULT" />
                </intent-filter>
            </activity>

            <activity android:name="eu.freemoser.myDebts2GoActivities.DatePickerActivity"></activity>
            <activity android:name="eu.freemoser.myDebts2GoActivities.LocationPickerActivity"></activity>

            <activity android:name="eu.freemoser.myDebts2GoActivities.SearchActivity">
                <intent-filter>
                    <action android:name="android.intent.action.SEARCH" />
                </intent-filter>
            </activity>

            <activity
                android:name="eu.freemoser.myDebts2GoActivities.DriveAuthorzingActivity"
                android:theme="@android:style/Theme.Translucent.NoTitleBar">
            </activity>

            <activity
                android:name="eu.freemoser.myDebts2GoActivities.FastModusShortcutActivity"
                android:exported="true"
                android:theme="@android:style/Theme.Holo.Light.NoActionBar">
            </activity>


            <!-- android:value="API_KEY" /> DEBUG-->

            <meta-data
                android:name="com.google.android.maps.v2.API_KEY"
                android:value="API_KEY" />
            <meta-data
                android:name="com.google.android.gms.version"
                android:value="VERSION" />


        </application>


    </manifest>

片段(发件人)

public class AwesomeDetailFragment extends Fragment implements ObservableScrollView.Callbacks, NfcAdapter.CreateNdefMessageCallback, NfcAdapter.OnNdefPushCompleteCallback {
    ...

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
       ...
        setUpAndroidBeam();
        return mRootView;
    }

    private void setUpAndroidBeam() {
        PackageManager pm = getActivity().getPackageManager();
        // Check whether NFC is available on device
        if (!pm.hasSystemFeature(PackageManager.FEATURE_NFC)) {
            // NFC is not available on the device.

        }
        // Check whether device is running Android 4.1 or higher
        else if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
            // Android Beam feature is not supported.

        } else {
            myNfcAdapter = NfcAdapter.getDefaultAdapter(getActivity());
            manageNfc();

        }
    }

    private void manageNfc() {
        if (myNfcAdapter != null) {
            myNfcAdapter.setNdefPushMessageCallback(this, getActivity());
            myNfcAdapter.setOnNdefPushCompleteCallback(this, getActivity());
        }
    }

    ...

    @Override
    public NdefMessage createNdefMessage(NfcEvent event) {
        Time time = new Time();
        time.setToNow();
        String text = myBetrag + "//" + myTitle + "//" + myContactName + "//" + myStatus + "//" + myDebtDate + "//" + myCreateDate + "//" + myRemamberDate + "//" + myNote;
        NdefMessage msg = new NdefMessage(
                new NdefRecord[]{createMimeRecord(
                        "application/eu.freemoser.myDebts2go", text.getBytes())});
        return msg;
    }

    public NdefRecord createMimeRecord(String mimeType, byte[] payload) {
        byte[] mimeBytes = mimeType.getBytes(Charset.forName("US-ASCII"));
        NdefRecord mimeRecord = new NdefRecord(
                NdefRecord.TNF_MIME_MEDIA, mimeBytes, new byte[0], payload);
        return mimeRecord;
    }

    @Override
    public void onNdefPushComplete(NfcEvent event) {

    }
}

活动(接收者)

public class Beam extends Activity {
    private Long userID = null;
    private Long adressID = null;

    private DBAdapter myDb;
    //NFC
    private String myBetrag;
    private String myTitle;
    private String myContactName;
    private String myDebtDate;
    private String myCreateDate;
    private String myStatus;
    private String myRemamberDate;
    private String myNote;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);


    }

    @Override
    protected void onResume() {
        super.onResume();
        if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) {
            processIntent(getIntent());
        }
    }

    void processIntent(Intent intent) {
        myDb = new DBAdapter(this);
        myDb.open();
        Parcelable[] rawMsgs = intent.getParcelableArrayExtra(
                NfcAdapter.EXTRA_NDEF_MESSAGES);
        // only one message sent during the beam
        NdefMessage msg = (NdefMessage) rawMsgs[0];
        // record 0 contains the MIME type, record 1 is the AAR, if present
        String temp = new String(msg.getRecords()[0].getPayload());
        String[] arrrayTemp = temp.split("//");
        try {
            myBetrag = arrrayTemp[0];
            myTitle = arrrayTemp[1];
            myContactName = arrrayTemp[2];
            myStatus = arrrayTemp[3];
            myDebtDate = arrrayTemp[4];
            myCreateDate = arrrayTemp[5];
            // can be "NOT"
            myRemamberDate = arrrayTemp[6];
            myNote = arrrayTemp[7];
            // checkValues
            channgeStatus();
            checkIfNot();
            checkUser();
            //write to database
            write();

        } catch (Exception ex) {
            this.finish();
        }


    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        myDb.close();
    }

    private void checkUser() {
        //do some stuff
       ...
    }

    private void write() {

    //do some stuff
       ...

    }

    private void checkIfNot() {
    //do some stuff
       ...
    }

    private void channgeStatus() {
    //do some stuff
       ...
    }

    @Override
    public void onNewIntent(Intent intent) {
        // onResume gets called after this to handle the intent
        setIntent(intent);
    }

}

1 个答案:

答案 0 :(得分:0)

Android的意图过滤器的MIME类型匹配区分大小写(尽管MIME类型本身不是这样)。因此,对于Android(以及几乎在任何地方使用它们),您应该坚持使用仅使用小写字母的MIME类型的约定。

特别是通过NFC接收的MIME类型记录,Android会自动将它们转换为全小写字母,以克服意图过滤器中区分大小写的问题。因此,在您的示例中,将意图过滤器中的类型名称更改为"application/eu.freemoser.mydebts2go"应该有效:

<intent-filter>
    <action android:name="android.nfc.action.NDEF_DISCOVERED"/>
    <category android:name="android.intent.category.DEFAULT"/>
    <data android:mimeType="application/eu.freemoser.mydebts2go"/>
</intent-filter>

此外,您还应确保仅以小写字母发送MIME类型:

NdefMessage msg = new NdefMessage(
            new NdefRecord[]{createMimeRecord(
                    "application/eu.freemoser.mydebts2go", text.getBytes())});
相关问题