質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

解決済

androidBeamに渡すUriの可否

js.making
js.making

総合スコア23

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

1回答

0評価

0クリップ

1607閲覧

投稿2016/07/31 12:51

編集2016/08/01 12:05

###前提・実現したいこと
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(); }

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。