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

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

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

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

Android Studio

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

Q&A

解決済

1回答

1744閲覧

androidBeamに渡すUriの可否

js.making

総合スコア23

Android

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

Android Studio

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

0グッド

0クリップ

投稿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(); }

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

・URIが正しいかは、URIをFileパスに変換し、File#existをして存在するかを確認しましょう。
・エラーログが出ているはずなのでそれを追記してください。

あと、AndroidBeam専用のURIは存在しません。リソースを一意に指し示すことがURIの役割です。

投稿2016/07/31 13:12

yona

総合スコア18155

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

js.making

2016/07/31 15:05

ありがとうございます! 試してみましたが、やはりLog出力するとexistはfalseになっていました。 Uriがファイルに直接つながっていないということなんでしょうか。 それ以外に特別エラーログらしきものは出ていませんでした…。
yona

2016/07/31 15:07

つながっていないではなく、間違っているんです。 どうやって取得したURIですか? 想像ですが、送信対象ファイルがなかったからタイムアウトかなにかが発生しているんでしょう。
js.making

2016/07/31 23:49

上記の、『ListFragmentのUri取得ソースコード』内に記載のコードから取得しました。 Listfragment内のListからonListitemClick内で取得したUriです。 ここでの取得方法自体が間違ってる、ということですよね… こちらでも調べてみます。 もし何か思い当たる所がありましたら、お手数ですが教えていただけますか?
yona

2016/08/01 01:00

ListViewのidからファイルのURIが組み立てられるのかがとても怪しいです。 ・idは飛び飛びになっていますか? ・Adapter宣言、初期化文を追記してください。
js.making

2016/08/01 01:30

idは飛び飛びではなく、リストの上から順に0,1,2…となっていたはずです。 ファイルごとのUriであれば、末尾の数字が飛び飛びになる、ということでよろしいでしょうか? 仕事の為、夜には仰せのコード部分をアップできると思います。 いつも丁寧にコメント頂き、ありがとうございます!
js.making

2016/08/01 12:06

Apapter宣言の部分、追記しました。
yona

2016/08/01 12:24

とりあえず、mp3の方はcolumnsにEXTERNAL_CONTENT_URIを追記して、それをURIとして使ってください。 もしかしたら、pdfの方もいけるかもしれないです。
js.making

2016/08/01 13:01

勉強不足ですみません。 「columnsにEXTERNAL_CONTENT_URIを追記して、それをURIとして使ってください。」の意味がよく分かりません。 columns以外でcr.queryの第1引数で「MediaStore.Audio.Media.EXTERNAL_CONTENT_URI」は渡していますが、その上で、columnsに「MediaStore.Audio.Media.EXTERNAL_CONTENT_URI」を追記する、ということでしょうか? ちなみにそれをすると、「MediaStore.Audio.Media.EXTERNAL_CONTENT_URI」の部分が赤いアンダーラインが出て、エラーとなってしまいます。
yona

2016/08/01 14:54

間違っていました。 まず、ContentResolver#queryで戻ってきた_IDをURIの組み立てに使ってください。 その場合、Adapterでは自作クラスをジェネリクスで指定してください。
js.making

2016/08/01 23:17

ありがとうございます!今晩試してみます。
js.making

2016/08/02 15:55

ビギナーながらに、「Adapterでは自作クラスをジェネリクスに指定」をいろいろネットで調べてやってみましたが、Adapterに自作クラスを指定したところ、今度はなぜかトラックに全部同じタイトルのものがズラっと並んでしまいました…もう少し試行錯誤してみます… ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問