当前位置:编程学习 > wap >>

关于android工程中nfc的功能问题

工程启动后,输入账号密码登陆成功后,转跳到首页,首页可以通过手机的nfc功能刷卡,读取IC卡的卡号,现在有一个问题就是,当工程启动之后,如果不登陆,刷卡之后,nfc也能响应,但是程序崩溃,原因是有空指针,因为没有登陆成功,很多东西都没有初始化,现在想通过判断登陆状态,来控制nfc刷卡功能的响应:登陆成功之后刷卡,nfc响应,没有登陆成功刷卡,nfc不响应。怎么在代码里面控制nfc的响应呢? android nfc 控指针 --------------------编程问答-------------------- 求指教,谢谢 --------------------编程问答-------------------- nfc刷卡是在用Service实现的吧?
登录以后才启动这个Service,或者用一个静态变量来记录是否登录成功,Service里面判断这个变量为true才会去读取卡号什么的操作,为false就不要操作。
--------------------编程问答--------------------
引用 2 楼 tantahe 的回复:
nfc刷卡是在用Service实现的吧?
登录以后才启动这个Service,或者用一个静态变量来记录是否登录成功,Service里面判断这个变量为true才会去读取卡号什么的操作,为false就不要操作。
我也是这样想的,下面附上代码和配置文件中的代码
protected void onResume() {
super.onResume();
// 得到是否检测到ACTION_TECH_DISCOVERED触发
if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) {
// 处理该intent
resolveIntent(getIntent());
}else if(NfcAdapter.ACTION_TAG_DISCOVERED.equals(getIntent().getAction())){
resolveIntent(getIntent());
}else if(NfcAdapter.ACTION_TECH_DISCOVERED.equals(getIntent().getAction())){
resolveIntent(getIntent());
}

}

void resolveIntent(Intent intent) {
String uid=Coverter.getUid(intent);
String text="本标签的UID为"+"【"+uid+"】";
Toast.makeText(this, text, Toast.LENGTH_SHORT).show();

}



 <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.lsh.readuid.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.nfc.action.TECH_DISCOVERED" />  
            </intent-filter>
            <meta-data  
                android:name="android.nfc.action.TECH_DISCOVERED"  
                android:resource="@xml/nfc_tech_filter" />
        </activity>
    </application>
--------------------编程问答-------------------- 不知道怎么判断哪个Service。PS:我是搞ios,android那边比较忙,过来帮忙搞这个nfc功能,业余班子,求指教 --------------------编程问答-------------------- 看你的配置文件,你就只有一个Activity啊....
按2L说的,你把NFC那块写到Service里面去 --------------------编程问答--------------------
引用 5 楼 guoyoulei520 的回复:
看你的配置文件,你就只有一个Activity啊....
按2L说的,你把NFC那块写到Service里面去
怎么写,求教育。 --------------------编程问答-------------------- 你这个貌似登录是一个apk,nfc是另外一个apk?
这样你需要在登录成功,启动nfc这个apk的时候,用Intent把是否登录成功的信息传递给nfc这个apk。在nfc这个apk中把Intent中对应的信息取出来,接下来的就可以处理了。
从登录apk中启动nfc apk的代码大概是这个样子(这段代码在登录apk中):
        Intent intent = new Intent();
        intent.putExtra("login", false);//这里就可以传进去是否登录成功的信息,假设用bool值。
        ComponentName cn = new ComponentName(pagName, claName);            
        intent.setComponent(cn);
        startActivity(intent);

在nfc apk中可以把这个bool值取出来:
getIntent().getBooleanExtra("login", false);//这里的false是默认值,也就是没取到值就默认false,取到了值就按取到的来。

这样你就可以判断到是不是登录了。

其实你的应用的问题不在这里。你把登录和nfc分成了两个apk来做,所以用户可以在没登录的情况下启动nfc。正确的做法是放到一个apk里面,登录了以后才转到nfc界面。最不济,你也的把nfc这个apk的Manifest里的
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
 
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
去掉,这样nfc apk就不会显示在Launcher里面,用户就不能在未登录时启动这个apk了。

几种解决方案,看你怎么选了。 --------------------编程问答--------------------
引用 7 楼 tantahe 的回复:
你这个貌似登录是一个apk,nfc是另外一个apk?
这样你需要在登录成功,启动nfc这个apk的时候,用Intent把是否登录成功的信息传递给nfc这个apk。在nfc这个apk中把Intent中对应的信息取出来,接下来的就可以处理了。
从登录apk中启动nfc apk的代码大概是这个样子(这段代码在登录apk中):
        Intent intent = new Intent();
        intent.putExtra("login", false);//这里就可以传进去是否登录成功的信息,假设用bool值。
        ComponentName cn = new ComponentName(pagName, claName);            
        intent.setComponent(cn);
        startActivity(intent);

在nfc apk中可以把这个bool值取出来:
getIntent().getBooleanExtra("login", false);//这里的false是默认值,也就是没取到值就默认false,取到了值就按取到的来。

这样你就可以判断到是不是登录了。

其实你的应用的问题不在这里。你把登录和nfc分成了两个apk来做,所以用户可以在没登录的情况下启动nfc。正确的做法是放到一个apk里面,登录了以后才转到nfc界面。最不济,你也的把nfc这个apk的Manifest里的
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
 
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
去掉,这样nfc apk就不会显示在Launcher里面,用户就不能在未登录时启动这个apk了。

几种解决方案,看你怎么选了。
是在一个apk里面 --------------------编程问答-------------------- 在一个apk里面怎么Manifest里面只有一个Activity呢?
如果在一个apk里面,一样的做法。登录Activity跳转到nfc Activity的时候,用intent携带是否登录成功的信息,在nfc Activity里面把这个信息取出来。代码都在上面了。 --------------------编程问答--------------------
引用 9 楼 tantahe 的回复:
在一个apk里面怎么Manifest里面只有一个Activity呢?
如果在一个apk里面,一样的做法。登录Activity跳转到nfc Activity的时候,用intent携带是否登录成功的信息,在nfc Activity里面把这个信息取出来。代码都在上面了。
Manifest代码只截取了一部分 --------------------编程问答-------------------- NFC的处理流程应该是这样的
1、在oncreate中初始化好nfc
2、在onresume启用nfc
 mAdapter.enableForegroundDispatch(this, mPendingIntent, mFilters,
                                          mTechLists);

3、在onpause中关闭nfc
if(mAdapter != null && mAdapter.isEnabled())
            mAdapter.disableForegroundDispatch(this);

4、当刷卡时,生命周期onpause->onnewintent->onresume

读卡信息是在Onnewintent中来实现的,所以只需根据是否登录的标记来判断是否读卡就行
在onnewintent中:
if(login)
  获取卡信息;
else
  return;
--------------------编程问答-------------------- LZ可以吧响应nfc的activity设置成透明的 然后在onresume中接受读卡的数据然后通过广播发送出去,直接关闭掉这个activity我的项目就是这么做得
补充:移动开发 ,  Android
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,