Wi-Fi Directを使いP2P通信で画像を転送するandroidアプリを作ろうとしています(android 7.0)。
WiFiDirectServiceDiscoveryを参考に接続の構築は実装できたのですが、接続完了後にソケットを通じて画像を送ると受信側には真っ黒の画像が表示されてしまいます。
現在はbitmapをbyte配列に変換した上でstreamに流し込み、受信側で再度bitmapに変換していますがreadやwriteの手順がおかしいのか正常な画像が転送できません。
以下に実装したコードを示します。問題点のご指摘および実装案の提示にご助力お願いいたします。
SendFragment
1 2public class WiFiChatFragment extends Fragment { 3--(略)-- 4 @Override 5 public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { 6 --(略)-- 7 //ボタンのタッチでカメラから画像を取得・送信 8 view.findViewById(R.id.button1).setOnClickListener( 9 new View.OnClickListener() { 10 11 @Override 12 public void onClick(View arg0) { 13 Bitmap bmp = null; 14 try { 15 mCaptureSession.stopRepeating(); // プレビューの更新を止める 16 if(mTextureView.isAvailable()) { 17 bmp= mTextureView.getBitmap();//bitmapを取得 18 if(bmp != null && imgManager != null){ 19 ByteArrayOutputStream baos = new ByteArrayOutputStream(); 20 bmp.compress(Bitmap.CompressFormat.JPEG, 100, baos);//bitmap -> byte(jpeg) 21 byte[] jpgarr = baos.toByteArray(); 22 StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().permitAll().build()); 23 chatManager.write(jpgarr);//Streamへ流す 24 25 } 26 } 27 mTextureView.findViewById(R.id.myTextureView).setVisibility(View.GONE); 28 } catch (CameraAccessException e) { 29 e.printStackTrace(); 30 } 31 } 32 }); 33 return view; 34 } 35}
chatManager
1public class ChatManager implements Runnable{ 2 private Socket socket = null; 3 private Handler handler; 4 public ChatManager(Socket socket, Handler handler) { 5 this.socket = socket; 6 this.handler = handler; 7 } 8 private InputStream iStream; 9 private OutputStream oStream; 10 private static final String TAG = "ChatHandler"; 11 @Override 12 public void run() { 13 try { 14 iStream = socket.getInputStream(); 15 oStream = socket.getOutputStream(); 16 byte[] buffer = new byte[1024]; 17 int bytes; 18 while (true) { 19 try { 20 // Read from the InputStream 21 bytes = iStream.read(buffer); 22 if (bytes == -1) { 23 break; 24 } 25 // Send the obtained bytes to the UI Activity 26 handler.obtainMessage(WiFiServiceDiscoveryActivity.MESSAGE_READ,bytes, -1, buffer).sendToTarget(); 27 } catch (IOException e) { 28 Log.e(TAG, "disconnected", e); 29 } 30 } 31 } catch (IOException e) { 32 e.printStackTrace(); 33 } finally { 34 try { 35 socket.close(); 36 } catch (IOException e) { 37 e.printStackTrace(); 38 } 39 } 40 } 41 42 public void write(byte[] buffer) { 43 try { 44 oStream.write(buffer); 45 } catch (IOException e) { 46 Log.e(TAG, "Exception during write", e); 47 } 48 } 49}
Activity
1//取得した画像を表示 2 @Override 3 public boolean handleMessage(Message msg) { 4 switch (msg.what) { 5 case MESSAGE_READ: 6 byte[] readBuf = (byte[]) msg.obj; 7 Bitmap readImg = null; 8 readImg = BitmapFactory.decodeByteArray(readBuf, 0, readBuf.length);//byte -> bitmap 9 10 (sendFragment).pushMessage(readImg);//List<Bitmap>へデータをプッシュ 11 12 break; 13 14 case MY_HANDLE: 15 --(略)-- 16 } 17 return true; 18 }
試したこととして、sendFragment内でbitmapをbyte配列に変換後にstreamに流す代わりにその場でbyteからbitmapに戻し描画させたところ、正常な画像が表示されました。このことから通信以外の理由で画像データが壊れた可能性は低いと考えています。
sendFragmentTest
1 try { 2 mCaptureSession.stopRepeating(); // プレビューの更新を止める 3 if(mTextureView.isAvailable()) { 4 bmp= mTextureView.getBitmap();//bitmapを取得 5 if(bmp != null && imgManager != null){ 6 ByteArrayOutputStream baos = new ByteArrayOutputStream(); 7 bmp.compress(Bitmap.CompressFormat.JPEG, 100, baos);//bitmap -> byte(jpeg) 8 byte[] jpgarr = baos.toByteArray(); 9 StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().permitAll().build()); 10 //chatManager.write(jpgarr); 11 //再度byteからBitmapへ(この場合正しい画像が描画された) 12 Bitmap readImg = null; 13 readImg = BitmapFactory.decodeByteArray(jpgarr, 0, jpgarr.length);//byte -> bitmap 14 pushMessage(readImg);//List<Bitmap>へデータをプッシュ 15 } 16 }

回答1件
あなたの回答
tips
プレビュー