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

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

ただいまの
回答率

88.36%

androidBeamに渡すUriの可否

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,271

js.making

score 24

前提・実現したいこと

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ページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/01 23:54

    間違っていました。

    まず、ContentResolver#queryで戻ってきた_IDをURIの組み立てに使ってください。

    その場合、Adapterでは自作クラスをジェネリクスで指定してください。

    キャンセル

  • 2016/08/02 08:17

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

    キャンセル

  • 2016/08/03 00:55

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

    キャンセル

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

  • ただいまの回答率 88.36%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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