Ben String
NFCaracılığıyla benim app screen pinning kullanıyor iken göndermeye çalışıyorum. Çalışmıyor: Transfer gerçekleşmiyor; ancak, String
çalışmalarının aktarımını sabitleyen ekranı devre dışı bırakırsam.Ekran Sabitleme sırasında NFC aracılığıyla nasıl bir dize gönderebilirim?
Ekran sabitlemesini biraz devre dışı bırakıp aktarımı devre dışı bırakabilirim, ancak bu bir güvenlik riskidir.
Bunu nasıl yapabilirim?
Denemek isterseniz, tüm kodları burada bulabilirsiniz. Tek yapmanız gereken, uygulama ayarlarınız aracılığıyla ekran sabitlemeyi manuel olarak etkinleştirmektir (bu yüzden daha az kod ve yine de aynı sonucu verir). Her ikisini de Android 5.0 çalıştıran iki Nexus 7 kullanarak test ettim.
Tüm bu kodları okumak zorunda değilsiniz, bu sorun, ekran sabitleme sırasında NFC'ye izin verecek manifestüme ekleyebileceğim bir şey biliyorsanız, muhtemelen çözülebilir.
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;
}
}
düzen
<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>
size örnek denediniz mi?Hangi Android sürümünü ve cihazı test ettiniz? Sadece Android 5.0.1 (LRX22C) çalıştıran bir Nexus 4 ile test ettim ve örneğiniz ekran sabitlendiğinde bile iyi çalışıyor. –
Android 5 çalıştıran iki Nexus 7s ile denedim. Her iki cihazda da sorun yaşanması için ekran sabitleme özelliği olmalıdır. –
Android 5.0.1'de örneğiniz hala çalışır: Alıcı cihazda, ekran otomatik olarak * sabitlenir * ve etkinliğin yeni bir örneği başlatılır. Bunun nedeni, manuel şifreleme ve program kodu ile yapılmaması olabilir mi? –