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

生姜可乐 2013-09-26 04:21:17
工程启动后,输入账号密码登陆成功后,转跳到首页,首页可以通过手机的nfc功能刷卡,读取IC卡的卡号,现在有一个问题就是,当工程启动之后,如果不登陆,刷卡之后,nfc也能响应,但是程序崩溃,原因是有空指针,因为没有登陆成功,很多东西都没有初始化,现在想通过判断登陆状态,来控制nfc刷卡功能的响应:登陆成功之后刷卡,nfc响应,没有登陆成功刷卡,nfc不响应。怎么在代码里面控制nfc的响应呢?
...全文
941 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
生姜可乐 2016-02-26
  • 打赏
  • 举报
回复
引用 17 楼 xiaoshuai1127 的回复:
[quote=引用 15 楼 wymaweiyue 的回复:] 回复了才看到这是13年的帖子,不知道楼主还能不能看到回复,如果看到了,希望能分享一下你的解决方法。
偶然的机会 发现了 把manifest.xml中的<category android:name="android.intent.category.DEFAULT" />这行去掉 就可以了 [/quote] 真的解决了吗?谢谢大家的帮助
xiaoshuai1127 2016-01-19
  • 打赏
  • 举报
回复
引用 15 楼 wymaweiyue 的回复:
回复了才看到这是13年的帖子,不知道楼主还能不能看到回复,如果看到了,希望能分享一下你的解决方法。
偶然的机会 发现了 把manifest.xml中的<category android:name="android.intent.category.DEFAULT" />这行去掉 就可以了
金色12点丶 2015-11-16
  • 打赏
  • 举报
回复
mAdapter 为空 NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(activity);没有获取到 好奇怪
wymaweiyue 2015-06-11
  • 打赏
  • 举报
回复
回复了才看到这是13年的帖子,不知道楼主还能不能看到回复,如果看到了,希望能分享一下你的解决方法。
wymaweiyue 2015-06-11
  • 打赏
  • 举报
回复
我也遇到同样的问题了,要用nfc读取学生卡(M1卡),求各路大神指教。
引用 11 楼 zhong871004 的回复:
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;
上面这个说法比较靠谱,我也是这么做的,但是在当前activity中没有能接受到nfc消息,我觉得应该是mAdapter.enableForegroundDispatch(this, mPendingIntent, mFilters,mTechLists);中的“ mPendingIntent, mFilters,mTechLists”三个参数内容写的不对导致的。希望有人能说说这三个参数应该怎么写,android菜鸟,搞不懂啊。我是这么写的: mPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, GecNfcActivity.class).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0); IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED); intentFiltersArray = new IntentFilter[]{ndef,}; techListsArray = new String[][]{new String[]{NfcA.class.getName()}};
tzl0588 2014-02-11
  • 打赏
  • 举报
回复
请问下关于这个帖子的问题您最后是怎么实现的,能否给解答下,要是可以希望分享份源码参考下。邮箱:754425094@qq.com
dengyao7878 2013-10-02
  • 打赏
  • 举报
回复
LZ可以吧响应nfc的activity设置成透明的 然后在onresume中接受读卡的数据然后通过广播发送出去,直接关闭掉这个activity我的项目就是这么做得
zhong871004 2013-09-28
  • 打赏
  • 举报
回复
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;
生姜可乐 2013-09-28
  • 打赏
  • 举报
回复
引用 9 楼 tantahe 的回复:
在一个apk里面怎么Manifest里面只有一个Activity呢? 如果在一个apk里面,一样的做法。登录Activity跳转到nfc Activity的时候,用intent携带是否登录成功的信息,在nfc Activity里面把这个信息取出来。代码都在上面了。
Manifest代码只截取了一部分
tantahe 2013-09-26
  • 打赏
  • 举报
回复
在一个apk里面怎么Manifest里面只有一个Activity呢? 如果在一个apk里面,一样的做法。登录Activity跳转到nfc Activity的时候,用intent携带是否登录成功的信息,在nfc Activity里面把这个信息取出来。代码都在上面了。
生姜可乐 2013-09-26
  • 打赏
  • 举报
回复
引用 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里面
tantahe 2013-09-26
  • 打赏
  • 举报
回复
你这个貌似登录是一个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了。 几种解决方案,看你怎么选了。
生姜可乐 2013-09-26
  • 打赏
  • 举报
回复
引用 5 楼 guoyoulei520 的回复:
看你的配置文件,你就只有一个Activity啊.... 按2L说的,你把NFC那块写到Service里面去
怎么写,求教育。
凉凉二点凉 2013-09-26
  • 打赏
  • 举报
回复
看你的配置文件,你就只有一个Activity啊.... 按2L说的,你把NFC那块写到Service里面去
生姜可乐 2013-09-26
  • 打赏
  • 举报
回复
不知道怎么判断哪个Service。PS:我是搞ios,android那边比较忙,过来帮忙搞这个nfc功能,业余班子,求指教
生姜可乐 2013-09-26
  • 打赏
  • 举报
回复
引用 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>
tantahe 2013-09-26
  • 打赏
  • 举报
回复
nfc刷卡是在用Service实现的吧? 登录以后才启动这个Service,或者用一个静态变量来记录是否登录成功,Service里面判断这个变量为true才会去读取卡号什么的操作,为false就不要操作。
生姜可乐 2013-09-26
  • 打赏
  • 举报
回复
求指教,谢谢

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧