2014-10-30 2 views
0

Я пытаюсь использовать Android Beam для передачи больших файлов между приложениями. Отправляющая часть работает хорошо, и файлы появляются в каталоге «beam /». В строке состояния уведомлений отображается «Beam complete». Однако получающее приложение не получает уведомления после того, как файлы переименованы в каталог beam /, а onNewIntent() никогда не будет вызван на принимающую сторону. Что я пропущу с помощью фильтра намерения? Также можно указать запись приложения Android при использовании createBeamUris()? ТИАКак перенести файлы с Android NFC

// sending app 
nfcAdapter.setBeamPushUrisCallback(this, this); 
... 
@Override 
public Uri[] createBeamUris(NfcEvent event) { // send files 
    File dir = Environment.getExternalStorageDirectory(); 
    File file = new File(dir, "test.txt"); 
    file.setReadable(true, false); // readable=true, ownerOnly=false 
    return new Uri[] { Uri.fromFile(file) }; 
} 

Мой Manifest.xml:

<activity 
    android:name=".BeamDemo2" 
    android:label="@string/app_name" 
    android:launchMode="singleTop" > 
    <intent-filter> 
     <action android:name="android.intent.action.MAIN" /> 
     <category android:name="android.intent.category.LAUNCHER" /> 
    </intent-filter> 
    <intent-filter> 
     <action android:name="android.intent.action.VIEW" /> 
     <category android:name="android.intent.category.DEFAULT" /> 
     <data android:scheme="file" /> 
     <data android:mimeType="*/*" /> 
     <data android:pathPattern=".*\\.txt" /> 
     <data android:host="*" /> 
    </intent-filter> 
    <intent-filter> 
     <action android:name="android.nfc.action.NDEF_DISCOVERED" /> 
     <category android:name="android.intent.category.DEFAULT" /> 
     <data android:mimeType="application/com.example.beamdemo2" /> 
    </intent-filter> 
</activity> 

Я также попытался enableForegroundDispatch():

@Override 
public void onResume() { 
    super.onResume(); 
    try { 
     PendingIntent mPendingIntent = PendingIntent.getActivity(this, 0, 
      new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0); 

     IntentFilter ndefIntent = new IntentFilter("android.intent.action.VIEW"); 
     ndefIntent.addCategory("android.intent.category.DEFAULT"); 
     ndefIntent.addDataType("*/*"); 
     IntentFilter[]mIntentFilters = new IntentFilter[] { ndefIntent }; 
     String[][] mNFCTechLists = new String[][] { new String[] { NfcF.class.getName() } }; 
     mNfcAdapter.enableForegroundDispatch(this, mPendingIntent, mIntentFilters, mNFCTechLists); 
    } catch (Exception e) { 
     Log.e("onResume", e.toString()); 
    } 
} 

ответ

0

Короткий ответ, нет ответа :-(После завершения Балка. , вам нужно снять уведомление «Beam Complete» и выбрать «View File». Это приведет к появлению Chooser, а затем в действие будет отправлено намерение VIEW. Я надеялся избежать этого ручного шага, но, похоже, быть неотвратимым е. Я также хотел бы избежать выбора Chooser для выбора приложения для просмотра, но это тоже кажется неизбежным. EnableForegroundDispatch похоже только для android.nfc.action.NDEF_DISCOVERED.

После выбора приложения все работает так, как ожидалось. Я вижу onNewIntent(), а затем onResume(). Одна странность, полученное намерение, похоже, сохраняется и продолжает появляться. После обработки намерения VIEW в onResume() мне пришлось убить его, вызвав setIntent (null).

@Override 
public void onNewIntent(Intent intent) { 
    super.onNewIntent(intent); 
    setIntent(intent); 
} 

@Override 
public void onResume() { 
    super.onResume(); 
    Intent intent = getIntent(); 
    if (Intent.ACTION_VIEW.equals(intent.getAction())) { 
     processIntent(intent); // 
     setIntent(null);  // kill this event 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^