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>
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. –
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 đề. –
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? –