13

携帯電話が NFC タグをスキャンするときに、特定のアクティビティを起動しようとしています。これは私のマニフェストがどのように見えるかです:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.lgandroid.ddcnfc"
android:versionCode="1"
android:versionName="1.0" >

<uses-permission android:name="android.permission.NFC"/>

<uses-sdk
    android:minSdkVersion="14"
    android:targetSdkVersion="16" />

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name="com.lgandroid.ddcnfc.BluePrintActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.nfc.action.NDEF_DISCOVERED"/>
            <data android:mimeType="application/com.lgandroid.ddcnfc"/>
            <category android:name="android.intent.category.DEFAULT"/>
        </intent-filter>
    </activity>
    <activity
        android:name="com.lgandroid.ddcnfc.LoginActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name="com.lgandroid.ddcnfc.MainActivity"
        android:label="@string/app_name" >
    </activity>
    <activity
        android:name="com.lgandroid.ddcnfc.PointDiagnosisActivity"
        android:label="@string/app_name" >
    </activity>
    <activity
        android:name="com.lgandroid.ddcnfc.PointControlActivity"
        android:label="@string/app_name" >
    </activity>
    <activity
        android:name="com.lgandroid.ddcnfc.SystemDiagnosisActivity"
        android:label="@string/app_name" >
    </activity>



    <activity android:name="com.lgandroid.ddcnfc.SettingsActivity" android:label="@string/app_name"></activity>
</application>

タグをスキャンするたびに、メイン アクティビティが起動しますが、BluePrintActivity を起動したいと思います。なぜそうなのかはわかりません。タグに書き込むための私のコードは次のとおりです。

private boolean writeTag(Tag tag) {
        NdefRecord appRecord = NdefRecord.createApplicationRecord("com.lgandroid.ddcnfc");
        NdefMessage message = new NdefMessage(new NdefRecord[] { appRecord });

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

                if (!ndef.isWritable()) {
                    nfcTextView.setText("Read-only tag.");
                    return false;
                }

                // work out how much space we need for the data
                int size = message.toByteArray().length;
                if (ndef.getMaxSize() < size) {
                    nfcTextView.setText("Tag doesn't have enough free space.");
                    return false;
                }

                ndef.writeNdefMessage(message);
                nfcTextView.setText("Tag written successfully.");
                return true;
            } else {
                // attempt to format tag
                NdefFormatable format = NdefFormatable.get(tag);
                if (format != null) {
                    try {
                        format.connect();
                        format.format(message);
                        nfcTextView.setText("Tag written successfully!\nClose this app and scan tag.");
                        return true;
                    } catch (IOException e) {
                        nfcTextView.setText("Unable to format tag to NDEF.");
                        return false;
                    }
                } else {
                    nfcTextView.setText("Tag doesn't appear to support NDEF format.");
                    return false;
                }
            }
        } catch (Exception e) {
            nfcTextView.setText("Failed to write tag");
        }

        return false;
    }

編集:上記で受け入れた回答は正しい方向に向けて私をほのめかしましたが、タグに書いていたので、受け入れられた回答のコードは正確な解決策ではありません. タグに書き込む場合は、次のことを行う必要があります。

 NdefRecord appRecord = new NdefRecord(
            NdefRecord.TNF_MIME_MEDIA ,
            "application/com.lgandroid.ddcnfc".getBytes(Charset.forName("US-ASCII")),
            new byte[0], new byte[0]);
    NdefMessage message = new NdefMessage(new NdefRecord[] { appRecord });

ペイロードを保存したい場合は、最後のパラメータ「new byte[0]」を適切なデータに置き換えてください。

4

2 に答える 2

10

アプリが起動する理由は、タグに Android アプリケーション レコードを書き込むためです。これにより、フィルタリングされたアクティビティの代わりに、一致するパッケージ名を持つアプリケーションが起動します。

MIME タイプをフィルタリングしているため、「application/com.lgandroid.ddcnfc」タイプの MIME レコードを作成する必要があるため、代わりに

NdefRecord appRecord = NdefRecord.createApplicationRecord("com.lgandroid.ddcnfc");

以下を使用する必要があります。

NdefRecord appRecord = NdefRecord.createMimeRecord("application/com.lgandroid.ddcnfc", byteArray);
于 2012-12-10T12:11:32.230 に答える
0

タグに AAR のみが保存されている限り、アプリケーションはデフォルトのアクティビティ (または現在のアクティビティ スタックなど) で起動されます。したがって、AAR はタグに保存された最後のレコードである必要があり、アプリを識別するためにのみ使用されます。

アクティビティの 1 つと一致する追加の NDEF レコードがある場合、タグを処理するために対応するアクティビティが開かれる可能性があります。ただし、私の実験ここでの別の質問は、このメカニズムが宣伝どおりに機能しないことを示しています。

別の解決策として、URL をタグのメッセージの 1 つとして保存し、制御しているサーバーで Web ページを開く (または Google Play に直接アクセスする) こともできます。

于 2012-12-10T16:32:40.830 に答える