###前提・実現したいこと
androidアプリを開発しています。
androidBeam4.1を使って、データを送信するアプリを作っています。
下記のソースコードに渡すUriは、この形で正しいのでしょうか?
音楽ファイル ******** content://media/external/audio/media/2 ******** pdfファイルのUri ******** content://media/文書データ1/file/15 ※pdfデータ名:文書データ1 ********
特にpdfのほうは、ファイル名の後にidが来ているので、これは間違っている気がするのですが…
androidBeamに渡すUriは、
正しい状態なのか、どなたか教えて頂けると助かります。
また、下記のソースコードの取得方法で誤りがあれば、
併せて教えて頂けると助かります。
宜しくお願いします。
###発生している問題・エラーメッセージ
ビームで別端末に送信の操作までは問題なく出来て、 送信側のスマホは「ビームしています」 受信側のスマホは「ビームを受信しています」 とNotificationの通知が出ています。 しかし、約10秒ほどで「ビームが完了しませんでした」と通知が返ってきてしまいます。 最初は音楽データが重いのかと思ったのですが、 pdfファイルは682kb程度のものでも送信できません。
###該当のソースコード
@Override public Uri[] createBeamUris(NfcEvent nfcEvent) { Log.i("TAG", "Beam event in progress; createBeamUris() called."); // Images are served using a content:// URI. See AssetProvider for implementation. Log.i("TAG", "Sending URI: " + sendUri + ":createBeamUris"); Log.i("TAG", "sendUri_string: " + sendUri_string + ":createBeamUris"); return new Uri[] {sendUri}; } public void onNdefPushComplete(NfcEvent arg0) { Log.d("TAG", "onNdefPushComplete"); Toast.makeText(getActivity(), "DATA_SENT!", Toast.LENGTH_LONG).show(); }
###ListFragmentのUri取得ソースコード
@Override public void onListItemClick(ListView l, View v, int position, long id) { String selectedItem = (String)l.getItemAtPosition(position); //選択したアイテムの名前(DATA名を取得) Log.d("TAG", "onListItemClick position => " + position + " : id => " + id); if (extension.equals(".mp3")) { // Append the clicked item's row ID with the content provider Uri sendUri = ContentUris.withAppendedId(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, id); }else if(extension.equals(".pdf")){ sendUri = ContentUris.withAppendedId(MediaStore.Files.getContentUri(selectedItem), id); } //データを渡す為のBundleを生成し、渡すデータを内包させる Bundle bundle = new Bundle(); bundle.putString("Uri", sendUri.toString()); //UriをSendDataFragmentへ引き継ぎ bundle.putString("selectedItem", selectedItem); //Data名をSendDataFragmentへ引き継ぎ Log.i("TAG", "Sending URI: " + sendUri + ":onListItemClick"); Log.i("TAG", "sendUri_string: " + sendUri.toString() + ":onListItemClick"); Log.i("TAG", "selectedItem: " + selectedItem + ":onListItemClick"); // Fragmentを生成し、setArgumentsで先ほどのbundleをセットする FragmentManager manager = getFragmentManager(); SendDataFragment sendDataFragment = new SendDataFragment(); sendDataFragment.setArguments(bundle); // FragmentをFragmentManagerにセットする FragmentTransaction transaction = getFragmentManager().beginTransaction(); transaction.replace(android.R.id.content, sendDataFragment, "SendData"); transaction.addToBackStack("second"); transaction.commit(); }
###アプリ内の画面推移
音楽ファイルやpdfファイルなど、データ種類を選択
↓
ListFragmentへ一覧を取得。itemを選択し、そのUriとデータ名をBundleを使って、
送信用のFragmentへ引き継ぎ。
↓
送信するデータ名を表示し、確認する画面。
この画面でNFCを使って、スマホを近づけると、データが送信される
###補足情報(言語/FW/ツール等のバージョンなど)
動作確認した端末情報
Xperia Z5 Premium (Android6.0)
SHL22 (android4.2.2)
どちらもandroidBeamには対応しているはずですが、
端末に起因することもあるのでしょうか?
###追加したコード(Adapter部分)
/* @param ArrayAdapter<String> songList; ContentResolverからデータを読み取り、ListFragmentのListViewへ出力するArrayAdapter */ //MainfragmentのMUSICボタンから起動した時の操作 if (extension.equals(".mp3")) { //音楽データを取得しListFragmentへ出力 columns = new String[]{ MediaStore.Audio.Media._ID, MediaStore.Audio.Media.ARTIST, MediaStore.Audio.Media.ALBUM, MediaStore.Audio.Media.DURATION, MediaStore.Audio.Media.TRACK, MediaStore.Audio.Media.TITLE }; ContentResolver cr = getActivity().getContentResolver(); Cursor cursor = cr.query( MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, columns, null, null, null ); if (cursor == null) throw new AssertionError(); if (cursor != null) cursor.moveToFirst(); songList = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1); do { //リストに名前を追加 songList.add(cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE))); } while (cursor.moveToNext()); setListAdapter(songList); cursor.close(); //**************** }else if(extension.equals(".pdf")){ //以下はpdfデータをListFragmentへ出力 columns = new String[]{ //query第2関数 MediaStore.Files.FileColumns.TITLE, MediaStore.Files.FileColumns.MIME_TYPE, MediaStore.Files.FileColumns.DATA }; ContentResolver cr = getActivity().getContentResolver(); Uri uri = MediaStore.Files.getContentUri("external"); //query第1関数 //query第3関数 selectionにMIME_TYPEを指定 String selectionMimeType = MediaStore.Files.FileColumns.MIME_TYPE + "=?"; //query第4関数 selectionArgsを指定 String mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension("pdf"); String[] selectionArgsPdf = new String[]{mimeType}; //query第5関数 sortOrderを指定 今回は指定なしの為、null String sortOrder = null; Cursor cursor = cr.query( uri, columns, selectionMimeType, selectionArgsPdf, sortOrder ); if (cursor == null) throw new AssertionError(); if (cursor != null) cursor.moveToFirst(); songList = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1); do { //リストに名前を追加 songList.add(cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.TITLE))); Log.i("TAG", "TITLE: " + MediaStore.Files.FileColumns.TITLE + ":odf"); Log.i("TAG", "MIMETYPE: " + MediaStore.Files.FileColumns.MIME_TYPE + ":pdf"); Log.i("TAG", "DATA: " + MediaStore.Files.FileColumns.DATA + "::pdf"); } while (cursor.moveToNext()); setListAdapter(songList); cursor.close(); }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/07/31 15:05
2016/07/31 15:07
2016/07/31 23:49
2016/08/01 01:00
2016/08/01 01:30
2016/08/01 12:06
2016/08/01 12:24
2016/08/01 13:01
2016/08/01 14:54
2016/08/01 23:17
2016/08/02 15:55