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

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

ただいまの
回答率

89.97%

BluetoothSocketを使って画像データをOutputStream,InputStreamで転送するプログラムがわかりません。

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,097

js.making

score 22

どなたか、教えて頂けるとありがたいです。
android java初心者です。

Bluetoothを使って画像送信・受信をするアプリを作ろうと、
様々な参考書やネット上のプログラムを参考し、作ってみております。

ですが、下記のプログラムで、どうしても、画像の送信と受信の部分がイマイチわかりません。

startServerThreadと、startClientThreadでそれぞれ送信、受信をする予定です。
OutputStreamとInputStreamを使っておりますが、
それで正しいのかもよく理解できておりません。

そして、画像を、
startServerThreadと、startClientThreadの中の
OutputStreamとInputStreamで画像のやりとりをしたいのですが、
記述方法がわかりません。

勉強不足で申し訳ありませんが、
教えてください。

よろしくお願いします。

package com.example.bluewifi;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.UUID;

import android.app.Activity;
import android.app.ProgressDialog;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothServerSocket;
import android.bluetooth.BluetoothSocket;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.os.Handler;
import android.provider.MediaStore;
import android.provider.MediaStore.Images.Media;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ToggleButton;

public class BlueWifi extends Activity {
    private static final int DURATION = 300;
    private static final int REQUEST_ENABLE_BLUETOOTH = 1;
    private static final int REQUEST_SELECT_DEVICE = 2;
    private static final int REQUEST_DISCOVERABLE = 3;
    private static final int REQUEST_CHOOSE_IMAGE = 4;
    private static final String SERVICE = "BluetoothContact";
    private static final UUID PROFILE = "任意のID");
    private BluetoothDevice device;
    private BluetoothAdapter bluetooth = BluetoothAdapter.getDefaultAdapter();
    private Thread serverThread;
    private Thread clientThread;
    private Handler handler = new Handler();
    private String picturePath;

    ToggleButton tb;
    ToggleButton tbwifi;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_blue_wifi);

        //toggleボタンにBluetoothの現在の有効/無効を反映
        tb = (ToggleButton)findViewById(R.id.ToggleButtonBluetooth);
        if(bluetooth != null){
            tb.setChecked(bluetooth.isEnabled());
        }else{
            Toast.makeText(getApplicationContext(), "Bluetoothがありません。", Toast.LENGTH_LONG).show();
        }

        //ToggleのCheckが変更したタイミングで呼び出し
        tb.setOnCheckedChangeListener(new OnCheckedChangeListener(){

            @Override
            public void onCheckedChanged(CompoundButton buttonView,
                    boolean isChecked) {
                // TODO Auto-generated method stub
                //トグルキーが変更された際に呼び出される
                Log.d("ToggleButton","Call Bluetooth OnCheckedChangeListener");

                //BT有効、無効切換

                if(isChecked){

                    Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
                    startActivityForResult(intent, REQUEST_ENABLE_BLUETOOTH);
                }else{
                    bluetooth.disable();
                }
            }
        });

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent intent){
        if(requestCode == REQUEST_ENABLE_BLUETOOTH){
            if(resultCode != RESULT_OK){
                Toast.makeText(this, "bluetoothがOFFの状態です。このアプリの機能を使うには、ONにしてください。", Toast.LENGTH_LONG);
            }
        }else if(requestCode == REQUEST_SELECT_DEVICE){
            if(resultCode == RESULT_OK){
                BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                setDevice(device);
            }
        }else if(requestCode == REQUEST_DISCOVERABLE){
            if(resultCode == DURATION){
                startServerThread();
            }
        }else if(requestCode == REQUEST_CHOOSE_IMAGE){
            if(resultCode == RESULT_OK && intent != null){
                                //選択された画像を取得する。
                Uri selectedImage = intent.getData();
                String[] filePathColumn = {Media.DATA};

                Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null);
                cursor.moveToFirst();

                int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
                picturePath = cursor.getString(columnIndex);
                cursor.close();

                TextView prev_send_data = (TextView)findViewById(R.id.send_data);
                prev_send_data.setText(picturePath);
                Toast.makeText(this, picturePath, Toast.LENGTH_LONG);
            }
        }
    }

    public void onSelectReceiverButtonClicked(View view){
        Intent intent = new Intent(this, DeviceList.class);
//DeviceList.classはBuletoothのデバイスを検索、選択するclassです。

        startActivityForResult(intent, REQUEST_SELECT_DEVICE);
    }

    public void onSendButtonClicked(View view){
        if(device != null){
            startClientThread();
        }
    }

    public void onReceiveButtonClicked(View view){
        Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
        intent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, DURATION);
        startActivityForResult(intent, REQUEST_DISCOVERABLE);
    }

    public void onSelectDataButtonClicked(View view){
         //画像を選択する
        Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        intent.setType("image/");
        startActivityForResult(intent, REQUEST_CHOOSE_IMAGE);
    }

    private void setDevice(BluetoothDevice device){
        this.device = device;
        TextView deviceName = (TextView)findViewById(R.id.receiver);
        if(device == null){
            deviceName.setText(R.string.not_selected);
        }else{
            deviceName.setText(this.device.getName());
        }
    }

    private void startServerThread(){
        if(serverThread != null){
            return;
        }
        final ProgressDialog progressDialog = new ProgressDialog(this);
        progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        progressDialog.setMessage(getString(R.string.receiving));
        progressDialog.show();
        serverThread = new Thread(){
            @Override
            public void run(){
                try{
                    BluetoothServerSocket serverSocket = bluetooth.listenUsingRfcommWithServiceRecord(SERVICE, PROFILE);
                    BluetoothSocket socket = serverSocket.accept();
                    serverSocket.close();
                    InputStream stream = socket.getInputStream();
                    byte[] bytes = new byte[1000];
                    int length = stream.read(bytes);
                    byte[] str = new byte[length];
                    for(int i=0; i<length; i++){
                        str[i] = bytes[i];
//この前後でどのように画像データを受け取るプログラムをかけばいいのか分かりません。
                    }
                    String images = new String(str);
                    handler.post(new Runnable(){

                        @Override
                        public void run() {
                            // TODO Auto-generated method stub
//この前後でどのように画像データを受け取るプログラムをかけばいいのか分かりません。
                            progressDialog.dismiss();
                            Toast.makeText(BlueWifi.this, R.string.received, Toast.LENGTH_LONG).show();
                        }

                    });
                }catch(IOException e){
                }
            }
        };
    }

    private void startClientThread(){
        if(clientThread != null){
            return;
        }
        final ProgressDialog progressDialog = new ProgressDialog(this);
        progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        progressDialog.setMessage(getString(R.string.sending));
        progressDialog.show();
        clientThread = new Thread(){
            @Override
            public void run(){
                try{
                    if(bluetooth.isDiscovering()){
                        bluetooth.cancelDiscovery();
                    }
                    BluetoothSocket socket = device.createRfcommSocketToServiceRecord(PROFILE);
                    socket.connect();
                    OutputStream stream = socket.getOutputStream();
//この辺りのプログラムで、画像の出力する記述方法が正しいのかわかりません。
                    byte[] buffer = picturePath.getBytes();
                    stream.write(buffer);
                    handler.post(new Runnable(){
                        @Override
                        public void run(){
                            progressDialog.dismiss();
                            setDevice(null);
                            Toast.makeText(BlueWifi.this, R.string.sent, Toast.LENGTH_LONG).show();
                        }
                    });
                }catch(Exception e){
                    handler.post(new Runnable(){
                        @Override
                        public void run(){
                            progressDialog.cancel();
                            Toast.makeText(BlueWifi.this, R.string.failed, Toast.LENGTH_LONG).show();
                        }
                    });
                }
                clientThread = null;
            }
        };
        clientThread.start();
    }



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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

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

  • ただいまの回答率 89.97%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる
  • トップ
  • Javaに関する質問
  • BluetoothSocketを使って画像データをOutputStream,InputStreamで転送するプログラムがわかりません。