首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Android应用程序中使用QR和NFC技术

在Android应用程序中使用QR和NFC技术
EN

Stack Overflow用户
提问于 2015-04-22 14:38:22
回答 1查看 69关注 0票数 0

到目前为止,我正在开发一个由两个活动组成的Android应用程序。第一个活动(MainActivity)是在启动应用程序或扫描QR代码时启动的。当用户按下按钮时,MainActivity启动第二个活动(NFCActivity)。NFCActivity等待用户点击NFC令牌,从令牌读取数据,并将读取的数据返回给MainActivity。

如果应用程序是手动启动的,这很好。如果应用程序是通过扫描QR代码启动的,记录NFC标记并不会调用NFCActivity的onNewIntent()方法作为exepcted,而是在已经显示的NFCActivity的基础上创建一个新实例。

调用enableForegroundDispatch()方法,并设置FLAG_ACTIVITY_SINGLE_TOP。下面提供了一个最小示例的相关源代码。任何帮助都将不胜感激!

MainActivity:

代码语言:javascript
运行
复制
public class MainActivity extends Activity {

    private EditText dataRead;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_start);

        dataRead = (EditText) findViewById(R.id.data);

        final Button readKeyButton = (Button) findViewById(R.id.readNFC);
        readKeyButton.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {

                Intent keyIntent = new Intent(MainActivity.this,
                    NFCActivity.class);
                keyIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

                startActivityForResult(keyIntent, 1);
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode,
        Intent intent) {

        if (requestCode == 1) {

            String result =     intent.getExtras().getString("resultData");
        this.dataRead.setText(result);
        }
    }
}

主要活动的GUI:

代码语言:javascript
运行
复制
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <Button
        android:id="@+id/readNFC"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="127dp"
        android:text="Read NFC Tag" />

    <EditText
        android:id="@+id/data"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@+id/readNFC"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="85dp"
        android:ems="10" >

        <requestFocus />
    </EditText>

</RelativeLayout>

NFCActivity:

代码语言:javascript
运行
复制
public class NFCActivity extends Activity {

    private NfcAdapter mAdapter;
    private PendingIntent pendingIntent;
    private IntentFilter[] mFilters;
    private String[][] mTechLists;  


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.read_nfc);

        mAdapter = NfcAdapter.getDefaultAdapter(this);
        pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this,
                getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);

        // // Setup an intent filter for all MIME based dispatches
        IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
        try {
            ndef.addDataType("*/*");
        } catch (MalformedMimeTypeException e) {
            throw new RuntimeException("fail", e);
        }
        IntentFilter td = new IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED);
        mFilters = new IntentFilter[] { ndef, td };
        //
        // // Setup a tech list for all NfcF tags
        mTechLists = new String[][] { new String[] { NfcV.class.getName(),
                NfcF.class.getName(), NfcA.class.getName(),
                NfcB.class.getName() } };

    }


    @Override
    public void onResume() {

        super.onResume();
        if (mAdapter != null)           
            mAdapter.enableForegroundDispatch(this, pendingIntent, mFilters,
                    mTechLists);
    }

    @Override
    public void onPause() {

        super.onPause();
        if (mAdapter != null)
            mAdapter.disableForegroundDispatch(this);
    }

    @Override
    public void onNewIntent(Intent intent) {

        Log.d("TEST", "onNewIntent() called.");

        // READ THE NFC TAG HERE [SKIPPED FOR MINIMAL EXAMPLE]

        // Return dummy data for test
        Intent result = new Intent();
        result.putExtra("resultData", "DUMMY DATA");

        setResult(1, result);
        finish();
    }   


}

NFCActivity的GUI:

代码语言:javascript
运行
复制
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#303030"
    android:paddingLeft="30dp"
    android:paddingRight="30dp" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:text="Tap your NFC tag.."
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:textColor="#FF8811"
        android:textSize="30sp"
        android:textStyle="bold" />

</RelativeLayout>

AndroidManifest.xml:

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="test.nfcqrtest"
    android:versionCode="1"
    android:versionName="1.0" >

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

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

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="test.nfcqrtest.MainActivity"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data android:scheme="myapp" android:host="test.org" android:pathPrefix="/testapp" />
            </intent-filter>            

        </activity>

        <activity
            android:name=".NFCActivity"
            android:windowSoftInputMode="stateHidden" android:screenOrientation="portrait" android:launchMode="singleTop">
        </activity>

    </application>

</manifest>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-27 05:25:39

如果有人面临类似的问题:我终于能够通过将MainActivityMainActivity属性设置为singleInstance来克服上述问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29800977

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档