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

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

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

Bluetoothとは短距離の間でデータを交換するための無線通信規格である。固定・モバイル両方のデバイスから、短波の電波送信を行うことで、高いセキュリティをもつパーソナルエリアネットワーク(PAN)を構築する。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

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

Q&A

解決済

1回答

1084閲覧

データを書き込むと画面が固まる

ShiroKuro1

総合スコア1

Bluetooth

Bluetoothとは短距離の間でデータを交換するための無線通信規格である。固定・モバイル両方のデバイスから、短波の電波送信を行うことで、高いセキュリティをもつパーソナルエリアネットワーク(PAN)を構築する。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

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

0グッド

0クリップ

投稿2020/07/17 03:21

編集2020/07/17 06:02

前提・実現したいこと

Javaでソケットを使用し、サーバPCからデータを受け取るアプリケーションを作成しています。
ソケット接続後、ボタンを押下するとデータを受信し内部ストレージにファイルを作成するよう開発しました。

ファイル作成後、ダイアログが生成されるはずなのですが、ボタン押下で画面が固まってしまいます。
DeviceFileManagerを確認してみると、ファイルは正常に作成・データの書込が行われていました。

エラーメッセージもなく、全く原因が分からなかったため質問させていただきました。
考えられる原因、解決策を教えていただきたいです。
よろしくお願いいたします。

該当のソースコード

Java

1import androidx.appcompat.app.AlertDialog; 2import androidx.appcompat.app.AppCompatActivity; 3 4import android.bluetooth.BluetoothAdapter; 5import android.bluetooth.BluetoothDevice; 6mport android.bluetooth.BluetoothSocket; 7 8import android.content.Context; 9import android.content.DialogInterface; 10import android.content.Intent; 11import android.net.Uri; 12import android.os.Bundle; 13import android.view.View; 14import android.widget.Button; 15import android.widget.TextView; 16import android.widget.Toast; 17import android.util.Log; 18 19import java.io.InputStream; 20import java.io.BufferedWriter; 21import java.io.File; 22import java.io.IOException; 23import java.io.InputStream; 24import java.io.OutputStream; 25import java.io.OutputStreamWriter; 26import java.util.UUID; 27 28public class MainActivity extends AppCompatActivity { 29 30 private static final String TAG = "MainActivity"; 31 String fileName = "Data.json"; 32 private TextView vText; 33 Uri uri; 34 35 // Bt関連 36 private BluetoothAdapter btAdapter = null; 37 private BluetoothDevice btDevice = null; 38 private BluetoothSocket btSocket = null; 39 private String MacAddress = "**:**:**:**:**:**"; 40 private String MY_UUID = "00001101-0000-1000-8000-00805F9B34FB"; 41 42 @Override 43 protected void onCreate(Bundle savedInstanceState) { 44 super.onCreate(savedInstanceState); 45 setContentView(R.layout.activity_main); 46 47 vText = findViewById(R.id.v_text); 48 Button sttBtn = findViewById(R.id.stt_btn); 49 sttBtn.setOnClickListener(new View.OnClickListener() { 50 @Override 51 public void onClick(View view) { 52 53 if (btSocket != null) { 54 StartPick(); 55 56 } 57 58 } 59 }); 60 61 BTConnect(); 62 } 63 64 protected void BTConnect() { 65 btAdapter = BluetoothAdapter.getDefaultAdapter(); 66 67 vText.setText(MacAddress); 68 69 btDevice = btAdapter.getRemoteDevice(MacAddress); 70 71 try { 72 btSocket = btDevice.createRfcommSocketToServiceRecord(UUID.fromString(MY_UUID)); 73 } catch (IOException e) { 74 btSocket = null; 75 } 76 77 if (btSocket != null) { 78 btAdapter.cancelDiscovery(); 79 try { 80 btSocket.connect(); 81 } catch (IOException connectException) { 82 Toast.makeText(MainActivity.this, "ソケット接続に失敗しました。", Toast.LENGTH_SHORT).show(); 83 try { 84 btSocket.close(); 85 btSocket = null; 86 } catch (IOException closeException) { 87 return; 88 } 89 } 90 } 91 } 92 93 private void StartPick() { 94 try (InputStream inputStream = btSocket.getInputStream(); 95 OutputStream outputStream = 96 openFileOutput(fileName, Context.MODE_PRIVATE); 97 OutputStreamWriter outputStreamWriter = 98 new OutputStreamWriter(outputStream, "UTF-8"); 99 BufferedWriter bufferedWriter = 100 new BufferedWriter(outputStreamWriter)) { 101 102 // InputStreamのバッファを格納 103 byte[] buffer = new byte[1024]; 104 // 取得したバッファサイズを格納 105 int len; 106 107 while (true) { 108 int len = inputStream.read(buffer); 109 if (len == -1) { 110 break; 111 } 112 outputStream.write(buffer, 0, len); 113 } 114 115 String readData = outputStream.toString(); 116 if (readData.trim() != null && !readData.trim().equals("")) { 117 bufferedWriter.write(readData); 118 new AlertDialog.Builder(MainActivity.this, R.style.Theme_CustonButtonDialog) 119 .setTitle("データ取得完了") 120 .setMessage("ファイルを作成しました。") 121 .setCancelable(false) 122 .setPositiveButton("OK", new DialogInterface.OnClickListener() { 123 @Override 124 public void onClick(DialogInterface dialogInterface, int i) { 125 File file = new File(getFilesDir(), fileName); 126 uri = Uri.fromFile(file); 127 Intent uriIntent = new Intent(getApplicationContext(), 128 NextActivity.class); 129 uriIntent.putExtra("Uri", uri); 130 startActivity(uriIntent); 131 } 132 }) 133 .show(); 134 } 135 136 } catch (IOException e) { 137 e.printStackTrace(); 138 } 139 try { 140 btSocket.close(); 141 } catch (IOException e) { 142 e.printStackTrace(); 143 } 144 } 145 146 @Override 147 protected void onDestroy() { 148 super.onDestroy(); 149 if (btSocket != null) { 150 try { 151 btSocket.connect(); 152 } catch (IOException connectException) { 153 /*ignore*/ 154 } 155 btSocket = null; 156 } 157 } 158}

補足情報(FW/ツールのバージョンなど)

AndroidStudio 4.0.1

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

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

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

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

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

guest

回答1

0

ベストアンサー

画面が固まる、ということはどこかで無限ループになってるか処理待ちしているか、で実行が止まっている状態です。

まずはどこで実行が止まっているかをデバッグ機能で調べることですね。

投稿2020/07/17 03:50

y_waiwai

総合スコア87749

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

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

ShiroKuro1

2020/07/17 06:15

ご回答ありがとうございます。 while文で実行が止まっており、試しにサーバPC側からソケット接続を切断してみると ボタンが動作するようになったことから、ずっとデータを待ち構えているのだと分かりました。 こちら側から送信されてきたデータの終わりを検知するためにいい方法はありませんか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問