12

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> 
+0

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. –

+0

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. –

+0

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? –

cevap

4

Sorunun gerçekten yanıtlandığını bilmiyorum, ancak bulgularımı özetlemek isterim:

Android 5.0.1'deki örneğinizi (Nexus 4'te LRX22C) denediğinizde, alıcı taraf otomatik olarak alıcıyı kaldırır. NDEF mesajını aldıktan sonra ekran ve (yeniden) etkinliği başlatır. Dolayısıyla, manifestte kayıtlı olan niyet filtresinin (manuel?) Ekran sabitlemesine göre öncelikli olduğu görülmektedir.

Bu sorunun anlatılan deneyimlerle tam olarak eşleşmediğinin farkındayım. Bunun farklı Android sürümünden (5.0 vs 5.0.1) kaynaklanmasından mı yoksa programlı ekran sabitleme yerine manuel ekran sabitleme kullanılmasından kaynaklanıyor muyum?

Test kurulumumda NDEF mesajını almak için aktiviteyi kaydetmek için ön plan gönderme sistemini kullanarak problemi çözebilir (yani aktivitenin otomatik olarak kaldırılmasını engelleyebilir):

onResume() yönteminizde beklemedeki bir niyet oluşturun ve ön plan gönderimini etkinleştirin:

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

Daha sonra, etkinliğin onActivityResult() yöntemiyle keşfedilen etiketleri hakkında ölçümlerini:

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

Üstelik size onPause() yönteminde ön plan sevk devre dışı bırakmak zorunda:

nfcAdapter.disableForegroundDispatch(this); 
İlgili konular