12

Tôi đang cố gắng gửi String qua NFC trong khi ứng dụng của tôi đang sử dụng screen pinning. Nó không hoạt động: Việc chuyển giao không xảy ra; nhưng nếu tôi vô hiệu hóa màn hình, hãy ghim việc chuyển giao các tác phẩm String.Làm cách nào để gửi chuỗi qua NFC trong khi Screen-Pinning?

Tôi có thể tắt khóa màn hình một chút và sau đó thực hiện chuyển, nhưng đó là một nguy cơ bảo mật.

Tôi làm cách nào để thực hiện việc này?


Đây là tất cả mã nếu bạn muốn thử. Tất cả những gì bạn cần làm là kích hoạt tính năng khóa màn hình theo cách thủ công thông qua cài đặt ứng dụng của bạn (vì vậy nó ít mã hơn và vẫn tạo ra kết quả tương tự). Tôi đã thử nghiệm điều này bằng cách sử dụng hai Nexus 7 cả hai đều chạy Android 5.0.

Bạn không cần phải đọc tất cả mã này, câu hỏi này có thể được giải quyết nếu bạn biết điều gì đó mà tôi có thể thêm vào tệp kê khai của mình cho phép NFC trong khi khóa màn hình.


AndroidManifest.xml

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

    <uses-sdk 
     android:minSdkVersion="16" 
     android:targetSdkVersion="19" /> 
    <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="com.example.androidnfc.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.NDEF_DISCOVERED" /> 
       <category android:name="android.intent.category.DEFAULT" /> 
       <data android:mimeType="text/plain" /> 
      </intent-filter> 
     </activity> 
    </application> 
</manifest> 

MainActivity.java

public class MainActivity extends Activity implements CreateNdefMessageCallback, OnNdefPushCompleteCallback 
{ 
    TextView textInfo; 
    EditText textOut; 
    NfcAdapter nfcAdapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     textInfo = (TextView)findViewById(R.id.info); 
     textOut = (EditText)findViewById(R.id.textout); 

     nfcAdapter = NfcAdapter.getDefaultAdapter(this); 
     nfcAdapter.setNdefPushMessageCallback(this, this); 
     nfcAdapter.setOnNdefPushCompleteCallback(this, this); 
    } 

    @Override 
    protected void onResume() 
    { 
     super.onResume(); 
     Intent intent = getIntent(); 
     String action = intent.getAction(); 

     if(action.equals(NfcAdapter.ACTION_NDEF_DISCOVERED)) 
     { 
     Parcelable[] parcelables = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES); 
     NdefMessage inNdefMessage = (NdefMessage)parcelables[0]; 
     NdefRecord[] inNdefRecords = inNdefMessage.getRecords(); 
     NdefRecord NdefRecord_0 = inNdefRecords[0]; 
     String inMsg = new String(NdefRecord_0.getPayload()); 
     textInfo.setText(inMsg); 
     } 
    } 

    @Override 
    protected void onNewIntent(Intent intent) { 
    setIntent(intent); 
    } 

    @Override 
    public void onNdefPushComplete(NfcEvent event) { 
     final String eventString = "onNdefPushComplete\n" + event.toString(); 
     runOnUiThread(new Runnable() { 

     @Override 
     public void run() { 
      Toast.makeText(getApplicationContext(), eventString, Toast.LENGTH_LONG).show(); 
     } 
     }); 
    } 

    @Override 
    public NdefMessage createNdefMessage(NfcEvent event) { 
     String stringOut = textOut.getText().toString(); 
     byte[] bytesOut = stringOut.getBytes(); 

     NdefRecord ndefRecordOut = new NdefRecord(
     NdefRecord.TNF_MIME_MEDIA, 
     "text/plain".getBytes(), 
       new byte[] {}, 
       bytesOut); 

     NdefMessage ndefMessageout = new NdefMessage(ndefRecordOut); 
     return ndefMessageout; 
    } 
} 

bố trí

<LinearLayout 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" 
    android:orientation="vertical" 
    tools:context="com.example.androidnfc.MainActivity" > 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_horizontal" 
     android:textStyle="bold" /> 

    <EditText 
     android:id="@+id/textout" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" /> 

    <TextView 
     android:id="@+id/info" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 
</LinearLayout> 
+0

Các bạn đã thử ví dụ của bạn?Bạn đã thử nghiệm phiên bản Android và thiết bị nào? Tôi vừa thử nghiệm với Nexus 4 chạy Android 5.0.1 (LRX22C) và ví dụ của bạn hoạt động tốt ngay cả khi màn hình được ghim. –

+0

Tôi đã thử nó với hai Nexus 7 chạy Android 5. Cả hai thiết bị của bạn phải có màn hình ghim vào để chạy vào các vấn đề. –

+0

Trên Android 5.0.1 ví dụ của bạn vẫn hoạt động: Trên thiết bị nhận, màn hình được tự động * bỏ ghim * và một phiên bản mới của hoạt động được bắt đầu. Điều này có thể do việc ghim thủ công và không thực hiện thông qua mã chương trình không? –

Trả lời

4

Tôi không chắc chắn nếu điều này thực sự trả lời câu hỏi của bạn, nhưng tôi muốn tóm tắt những phát hiện của tôi:

Khi thử ví dụ của bạn trên Android 5.0.1 (LRX22C trên Nexus 4), phía nhận sẽ tự động bỏ ghim màn hình khi nhận được thông báo NDEF và (lại) bắt đầu hoạt động. Vì vậy, có vẻ như bộ lọc ý định được đăng ký trong tệp kê khai được ưu tiên trên màn hình (thủ công?).

Tôi biết rằng điều này không hoàn toàn khớp với trải nghiệm được mô tả trong câu hỏi. Tôi tự hỏi nếu điều này là do phiên bản Android khác nhau (5.0 so với 5.0.1) hoặc do việc sử dụng ghim màn hình thủ công thay vì khóa màn hình bằng tay ...

Trong quá trình thiết lập thử nghiệm, tôi đã có thể giải quyết vấn đề (tức là ngăn không cho hoạt động tự động được bỏ ghim) bằng cách sử dụng hệ thống công văn tiền cảnh để đăng ký hoạt động để nhận thông báo NDEF:

Phương pháp onResume() của bạn tạo một mục đích đang chờ xử lý như thế này

PendingIntent pi = this.createPendingResult(0x00A, new Intent(), 0); 
nfcAdapter.enableForegroundDispatch(this, pi, null, null); 

Sau đó, bạn sẽ nhận được ý định không tifying bạn về các thẻ phát hiện thông qua phương pháp của hoạt động onActivityResult():

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    switch (requestCode) { 
     case 0x00A: 
      onNewIntent(data); 
     break; 
    } 
} 

Hơn nữa, bạn phải vô hiệu hóa các văn foreground trong phương pháp onPause() của bạn:

nfcAdapter.disableForegroundDispatch(this); 
Các vấn đề liên quan