Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 通过伪造NFC标签扫描测试应用程序_Android_Android Intent_Mocking_Nfc_Ndef - Fatal编程技术网

Android 通过伪造NFC标签扫描测试应用程序

Android 通过伪造NFC标签扫描测试应用程序,android,android-intent,mocking,nfc,ndef,Android,Android Intent,Mocking,Nfc,Ndef,我是Android新手,致力于近场通信,从NFC标签读取数据。我既没有NFC支持的Android mobile,也没有NFC标签来测试我创建的应用程序 我发现下面两篇文章说的是通过触发意图来伪造NFC标签扫描 我根据第一篇文章修改了我的代码,点击一个按钮,我触发了第一个活动中所需的意图。然而,我又创造了一个能够处理相同意图的活动。NFC标签的读取和处理数据基于第二个活动上的按钮点击 问题是:每当我从第一个活动触发伪NFC标记扫描意图时,它都会抛出一个错误“找不到处理意图的活动{act=and

我是Android新手,致力于近场通信,从NFC标签读取数据。我既没有NFC支持的Android mobile,也没有NFC标签来测试我创建的应用程序

我发现下面两篇文章说的是通过触发意图来伪造NFC标签扫描

  • 我根据第一篇文章修改了我的代码,点击一个按钮,我触发了第一个活动中所需的意图。然而,我又创造了一个能够处理相同意图的活动。NFC标签的读取和处理数据基于第二个活动上的按钮点击

    问题是:每当我从第一个活动触发伪NFC标记扫描意图时,它都会抛出一个错误“找不到处理意图的活动{act=android.NFC.action.NDEF_DISCOVERED(has extras)}

    清单文件如下所示:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.expensemanager.saubhattacharya">
    
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.NFC"/>
    
    <uses-feature android:name="android.hardware.nfc" android:required="false" />
    
    <application
        android:allowBackup="true"
        android:icon="@mipmap/icon1"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
    
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".Set_Monthly_Target"
            android:label="@string/title_activity_set__monthly__target"
            android:parentActivityName=".MainActivity">
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value="com.expensemanager.saubhattacharya.MainActivity" />
            <intent-filter>
                <action android:name="android.nfc.action.NDEF_DISCOVERED" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="text/plain"/>
                <data android:mimeType="image/*" />
            </intent-filter>
        </activity>
        <activity
            android:name=".Add_Daily_Expense"
            android:label="@string/add_daily_expense_activity"
            android:parentActivityName=".MainActivity">
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value="com.expensemanager.saubhattacharya.MainActivity" />
            <intent-filter>
                <action android:name="android.nfc.action.NDEF_DISCOVERED" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="text/plain"/>
                <data android:mimeType="image/*" />
            </intent-filter>
        </activity>
    </application>
    
    </manifest>
    
    处理上述触发器的第二个活动的代码段如下:

    public void scan_tag (View view)
    {
        final Intent intent = new Intent(NfcAdapter.ACTION_NDEF_DISCOVERED);
        intent.putExtra(NfcAdapter.EXTRA_NDEF_MESSAGES, "Custom Messages");
        startActivity(intent);
    }
    
    public class Add_Daily_Expense extends AppCompatActivity {
    
    Button read_data;
    TextView show_data;
    Tag detected_tag;
    NfcAdapter nfcAdapter;
    IntentFilter[] intentFilters;
    public static final String MIME_TEXT_PLAIN = "text/plain";
    public static final String MIME_IMAGE_ALL = "image/*";
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add__daily__expense);
        final PackageManager pm = this.getPackageManager();
        show_data = (TextView) findViewById(R.id.show_data);
        nfcAdapter = NfcAdapter.getDefaultAdapter(getApplicationContext());
        read_data = (Button) findViewById(R.id.read_nfc);
        read_data.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (!pm.hasSystemFeature(PackageManager.FEATURE_NFC)) {
                    try {
                        AlertDialog.Builder builder = new AlertDialog.Builder(Add_Daily_Expense.this);
                        builder.setMessage("NFC feature is not available on this device!")
                                .setCancelable(false)
                                .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                                    public void onClick(DialogInterface dialog, int id) {
                                        dialog.cancel();
                                    }
                                });
                        AlertDialog alert = builder.create();
                        alert.show();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                } else {
                    Toast.makeText(getApplicationContext(), "NFC feature is available on this device!", Toast.LENGTH_SHORT).show();
                    HandleIntent(getIntent());
                }
            }
        });
    }
    
    public void HandleIntent(Intent intent)
    {
        String action = intent.getAction();
        if(NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action))
        {
            detected_tag = getIntent().getParcelableExtra(nfcAdapter.EXTRA_TAG);
            NDefReaderTask NDefReader = new NDefReaderTask();
            NDefReader.execute();
        }
    }
    
    public void onResume()
    {
        super.onResume();
        if(nfcAdapter != null)
        setupForeGroundDispatch(this, nfcAdapter);
    }
    
    public void onPause()
    {
        super.onPause();
        if(nfcAdapter != null)
        stopForeGroundDispatch(this, nfcAdapter);
    }
    
    public void onNewIntent(Intent intent)
    {
        HandleIntent(intent);
    }
    
    public void setupForeGroundDispatch (final Activity activity, NfcAdapter nfcAdapter)
    {
        Intent new_intent = new Intent(getApplicationContext(),Add_Daily_Expense.class);
        new_intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
    
        PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(),0,new_intent,0);
        intentFilters = new IntentFilter[1];
        String[][] techList = new String[][]{};
    
        intentFilters[0] = new IntentFilter();
        intentFilters[0].addAction(NfcAdapter.ACTION_NDEF_DISCOVERED);
        intentFilters[0].addCategory(Intent.CATEGORY_DEFAULT);
        try {
            intentFilters[0].addDataType(MIME_TEXT_PLAIN);
            intentFilters[0].addDataType(MIME_IMAGE_ALL);
        }
        catch(IntentFilter.MalformedMimeTypeException me)
        {
            me.printStackTrace();
        }
    
        nfcAdapter.enableForegroundDispatch(activity, pendingIntent, intentFilters, techList);
    }
    
    public void stopForeGroundDispatch (final Activity activity, NfcAdapter nfcAdapter)
    {
        nfcAdapter.disableForegroundDispatch(activity);
    }
    
    public class NDefReaderTask extends AsyncTask <Tag, Void, String>
    {
        @Override
        protected String doInBackground(Tag... params)
        {
            try
            {
                detected_tag = params[0];
                Ndef ndef = Ndef.get(detected_tag);
                ndef.connect();
                if(ndef != null)
                {
                    NdefMessage ndefMessage = ndef.getCachedNdefMessage();
                    NdefRecord[] records = ndefMessage.getRecords();
                    for(NdefRecord ndefRecord : records)
                    {
                        if((ndefRecord.getTnf() == NdefRecord.TNF_ABSOLUTE_URI) || (ndefRecord.getTnf() == NdefRecord.TNF_WELL_KNOWN))
                        {
                            byte[] payload = ndefRecord.getPayload();
                            String encoding1 = "UTF-8";
                            String encoding2 = "UTF-16";
                            String textEncoding = ((payload[0] & 128) == 0) ? encoding1 : encoding2;
                            int languageCodeLength = payload[0] & 0063;
                            return new String(payload, languageCodeLength + 1, payload.length - languageCodeLength - 1, textEncoding);
                        }
                    }
                }
                ndef.close();
            }
            catch (UnsupportedEncodingException UE)
            {
                UE.printStackTrace();
            }
            catch (IOException IE)
            {
                IE.printStackTrace();
            }
            return null;
        }
    
        @Override
        protected void onPreExecute()
        {
    
        }
    
        protected void onPostExecute(String result)
        {
            if(result != null)
            {
                show_data.setText(result);
            }
        }
    }
    }
    
    公共类添加日常费用活动{
    按钮读取数据;
    文本视图显示数据;
    检测到的标签\u标签;
    NfcAdapter NfcAdapter;
    意向过滤器[]意向过滤器;
    公共静态最终字符串MIME\u TEXT\u PLAIN=“TEXT/PLAIN”;
    公共静态最终字符串MIME_IMAGE_ALL=“IMAGE/*”;
    @凌驾
    创建时受保护的void(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity\u add\u daily\u expense);
    final PackageManager pm=this.getPackageManager();
    show_data=(TextView)findViewById(R.id.show_data);
    nfcAdapter=nfcAdapter.getDefaultAdapter(getApplicationContext());
    读取数据=(按钮)findViewById(R.id.read\u nfc);
    read_data.setOnClickListener(新视图.OnClickListener(){
    @凌驾
    公共void onClick(视图v){
    如果(!pm.hasSystemFeature(PackageManager.FEATURE\u NFC)){
    试一试{
    AlertDialog.Builder=新建AlertDialog.Builder(添加每日费用。此项);
    setMessage(“此设备上没有NFC功能!”)
    .setCancelable(错误)
    .setPositiveButton(“确定”,新的DialogInterface.OnClickListener(){
    public void onClick(DialogInterface对话框,int-id){
    dialog.cancel();
    }
    });
    AlertDialog alert=builder.create();
    alert.show();
    }捕获(例外e){
    e、 printStackTrace();
    }
    }否则{
    Toast.makeText(getApplicationContext(),“此设备上有NFC功能!”,Toast.LENGTH\u SHORT.show();
    HandleIntent(getIntent());
    }
    }
    });
    }
    公共无效手册内容(意图)
    {
    String action=intent.getAction();
    if(NfcAdapter.ACTION\u NDEF\u DISCOVERED.equals(ACTION))
    {
    检测到的_标记=getIntent().getParcelableExtra(nfcAdapter.EXTRA_标记);
    NDefReaderTask NDefReader=新的NDefReaderTask();
    NDefReader.execute();
    }
    }
    恢复时公开作废()
    {
    super.onResume();
    如果(nfcAdapter!=null)
    setupForeGroundDispatch(本,nfcAdapter);
    }
    公共无效暂停()
    {
    super.onPause();
    如果(nfcAdapter!=null)
    stopForeGroundDispatch(本,nfcAdapter);
    }
    公共帐篷(意向)
    {
    手册内容(意图);
    }
    公共无效设置ForegroundDispatch(最终活动活动,NfcAdapter NfcAdapter)
    {
    Intent new\u Intent=newintent(getApplicationContext(),Add\u Daily\u Expense.class);
    新的\u意向。设置标志(意向。标志\u活动\u单个\u顶部);
    pendingent pendingent=pendingent.getActivity(getApplicationContext(),0,new_intent,0);
    intentFilters=新IntentFilter[1];
    字符串[][]技术列表=新字符串[][]{};
    IntentFilter[0]=新的IntentFilter();
    intentFilters[0].addAction(发现NfcAdapter.ACTION\u NDEF\u);
    intentFilters[0].addCategory(Intent.CATEGORY\u默认值);
    试一试{
    intentFilters[0]。addDataType(MIME\u TEXT\u PLAIN);
    intentFilters[0]。addDataType(MIME\u IMAGE\u ALL);
    }
    捕获(IntentFilter.MalformAdminetypeException me)
    {
    me.printStackTrace();
    }
    nfcAdapter.enableForegroundDispatch(活动、未决事件、意向过滤器、技术列表);
    }
    公共作废stopForeGroundDispatch(最终活动活动,NfcAdapter NfcAdapter)
    {
    nfcAdapter.disableForegroundDispatch(活动);
    }
    公共类NDefReaderTask扩展了AsyncTask
    {
    @凌驾
    受保护的字符串doInBackground(标记…参数)
    {
    尝试
    {
    检测到的_标记=参数[0];
    Ndef Ndef=Ndef.get(检测到的标签);
    connect();
    如果(ndef!=null)
    {
    NdefMessage NdefMessage=ndef.getCachedNdefMessage();
    NdefRecord[]records=ndefMessage.getRecords();
    用于(NdefRecord NdefRecord:记录)
    {
    if((ndefRecord.getTnf()==ndefRecord.TNF_绝对值_URI)| |(ndefRecord.getTnf()==ndefRecord.TNF_众所周知))
    {
    字节[]有效载荷=ndefRecord.getPayload();
    字符串编码1=“UTF-8”;
    字符串编码2=“UTF-16”;
    字符串textEncoding=((有效负载[0]&128)==0)?编码1:encoding2;
    int languageCodeLength=有效负载[0]&0063;
    返回新字符串(payload,languageCodeLength+1,payload.length-languageCodeLength-1,textEncoding);
    }
    }
    }
    ndef.close();
    }
    捕获(不支持的编码异常)
    {
    UE.printStackTrace();
    }
    捕获(IOIE)
    {
    即printStackTrace();
    }
    返回null;
    }
    @凌驾
    普罗特
    
    <data android:mimeType="text/plain"/>
    <data android:mimeType="image/*" />
    
    public void scan_tag (View view) {
        final Intent intent = new Intent(NfcAdapter.ACTION_NDEF_DISCOVERED);
        intent.setType("text/plain");
        intent.putExtra(NfcAdapter.EXTRA_NDEF_MESSAGES, ...);
        startActivity(intent);
    }
    
    detected_tag = getIntent().getParcelableExtra(nfcAdapter.EXTRA_TAG);
    
    Ndef ndef = Ndef.get(detected_tag);