OSDN Git Service

ライブビューができるようになった。
authorMRSa <mrsa@myad.jp>
Mon, 6 May 2019 11:39:14 +0000 (20:39 +0900)
committerMRSa <mrsa@myad.jp>
Mon, 6 May 2019 11:39:14 +0000 (20:39 +0900)
app/src/main/java/net/osdn/gokigen/cameratest/MainActivity.java
app/src/main/java/net/osdn/gokigen/cameratest/camtest/CamTest.java
app/src/main/java/net/osdn/gokigen/cameratest/fuji/FujiStreamReceiver.java
app/src/main/java/net/osdn/gokigen/cameratest/fuji/ReceivedDataHolder.java
app/src/main/res/menu/menu_main.xml
app/src/main/res/values/strings.xml

index 1f3f494..a9caab9 100644 (file)
@@ -120,7 +120,7 @@ public class MainActivity extends AppCompatActivity
      *
      */
     @Override
-    public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults)
+    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)
     {
         super.onRequestPermissionsResult(requestCode, permissions, grantResults);
         prepareClass();
@@ -175,14 +175,14 @@ public class MainActivity extends AppCompatActivity
             exitApplication();
             return (true);
         }
-        if (id == R.id.action_add_value)
+        if (id == R.id.action_up_value)
         {
-            testTarget.addValue();
+            testTarget.valueUp();
             return (true);
         }
-        if (id == R.id.action_delete_value)
+        if (id == R.id.action_down_value)
         {
-            testTarget.deleteValue();
+            testTarget.valueDown();
             return (true);
         }
         return super.onOptionsItemSelected(item);
index 6899117..e89b583 100644 (file)
@@ -18,23 +18,10 @@ import net.osdn.gokigen.cameratest.fuji.ReceivedDataHolder;
 
 import androidx.annotation.NonNull;
 
-import org.opencv.android.Utils;
-import org.opencv.core.Mat;
-import org.opencv.core.Size;
-import org.opencv.imgcodecs.Imgcodecs;
-
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
-import java.io.FileWriter;
-import java.io.InputStream;
-import java.nio.ByteBuffer;
-import java.util.Arrays;
 
-import static org.opencv.core.CvType.CV_16UC3;
-import static org.opencv.core.CvType.CV_8UC1;
-import static org.opencv.core.CvType.CV_8UC3;
-import static org.opencv.imgcodecs.Imgcodecs.IMREAD_COLOR;
 
 public class CamTest implements View.OnClickListener, ILiveViewImage
 {
@@ -43,8 +30,7 @@ public class CamTest implements View.OnClickListener, ILiveViewImage
     private TextView textview;
     private Connection connection;
     private FileOutputStream outputStream = null;
-    private FileWriter fileWriter = null;
-    private int offsetSize = 0;
+    private int offsetSize = 18;  // 4byte: データサイズ、14byte: (謎の)ヘッダ
 
     public CamTest(@NonNull Activity activity)
     {
@@ -87,20 +73,18 @@ public class CamTest implements View.OnClickListener, ILiveViewImage
         showMessageText("BBBB");
     }
 
-    public void addValue()
+    public void valueUp()
     {
-        Log.v(TAG, "add value");
-
+        Log.v(TAG, "value UP");
         offsetSize++;
-        showMessageText(" OFFSET VALUE : " + offsetSize);
+        showMessageText("OFFSET : " + offsetSize);
     }
 
-    public void deleteValue()
+    public void valueDown()
     {
-        Log.v(TAG, "delete value");
-
+        Log.v(TAG, "value DOWN");
         offsetSize--;
-        showMessageText(" OFFSET VALUE : " + offsetSize);
+        showMessageText("OFFSET : " + offsetSize);
     }
 
 
@@ -182,8 +166,8 @@ public class CamTest implements View.OnClickListener, ILiveViewImage
         try
         {
             final byte[] dataValue = receivedData.getData();
-            byte[] startJpegMarker = {(byte)0xff, (byte)0xd8};
-            byte[] endJpegMarker   = {(byte)0xff, (byte)0xd9};
+            //byte[] startJpegMarker = {(byte)0xff, (byte)0xd8};
+            //byte[] endJpegMarker   = {(byte)0xff, (byte)0xd9};
 
             Log.v(TAG, "Image : "+ dataValue.length + " bytes.");
 
@@ -192,34 +176,23 @@ public class CamTest implements View.OnClickListener, ILiveViewImage
 
             ///////  Bitmap画像を作る... //////
             final Bitmap imageData = getBitmap(receivedData);
-/*
-            final Bitmap imageData = BitmapFactory.decodeByteArray(dataValue, 18, (dataValue.length - 18));
-            if (imageData == null)
+            if (imageData != null)
             {
-                Log.v(TAG, "imageData is null...");
-            }
-            else
-            {
-                Log.v(TAG, "imageData : " + imageData.getByteCount() + " bytes.");
-            }
-*/
-            //////  画像を更新する
-            activity.runOnUiThread(new Runnable() {
-                @Override
-                public void run() {
-                    try
-                    {
-                        // ビットマップイメージを表示する。
-                        ImageView view = activity.findViewById(R.id.imageView);
-                        view.setImageBitmap(imageData);
-                        view.invalidate();
-                    }
-                    catch (Throwable e)
-                    {
-                        e.printStackTrace();
+                //////  画像を更新する
+                activity.runOnUiThread(new Runnable() {
+                    @Override
+                    public void run() {
+                        try {
+                            // ビットマップイメージを表示する。
+                            ImageView view = activity.findViewById(R.id.imageView);
+                            view.setImageBitmap(imageData);
+                            view.invalidate();
+                        } catch (Throwable e) {
+                            e.printStackTrace();
+                        }
                     }
-                }
-            });
+                });
+            }
         }
         catch (Throwable e)
         {
@@ -267,12 +240,6 @@ public class CamTest implements View.OnClickListener, ILiveViewImage
                 final byte[] byteData = receivedData.getData();
                 outputStream.write(byteData, 0, byteData.length);
             }
-            if (fileWriter != null)
-            {
-                final char[] charData = receivedData.getCharData();
-                fileWriter.write(charData, 0, charData.length);
-                fileWriter.flush();
-            }
         }
         catch (Exception e)
         {
@@ -282,25 +249,17 @@ public class CamTest implements View.OnClickListener, ILiveViewImage
 
     private void prepareFile()
     {
-        boolean useStream = true;
         try
         {
             final String directoryPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getPath() + "/AirA01a/";
             final String outputFileName = "camtest.bin";
             File filepath = new File(directoryPath.toLowerCase(), outputFileName.toLowerCase());
-            if (useStream) {
-                outputStream = new FileOutputStream(filepath);
-                fileWriter = null;
-            } else {
-                outputStream = null;
-                fileWriter = new FileWriter(filepath);
-            }
-        }
+            outputStream = new FileOutputStream(filepath);
+          }
         catch (Exception e)
         {
             e.printStackTrace();
             outputStream = null;
-            fileWriter = null;
         }
     }
 
@@ -309,11 +268,7 @@ public class CamTest implements View.OnClickListener, ILiveViewImage
         Thread thread = new Thread(new Runnable() {
             @Override
             public void run() {
-                if (offsetSize < 0) {
                     readImageFileImpl(readFileName);
-                } else {
-                    readImageFileImpl2nd(readFileName);
-                }
             }
         });
         try
@@ -369,94 +324,27 @@ public class CamTest implements View.OnClickListener, ILiveViewImage
         }
     }
 
-    private void readImageFileImpl2nd(final String readFileName)
+
+    private Bitmap getBitmap(ReceivedDataHolder receivedData)
     {
         try
         {
-            Log.v(TAG, "readImageFileImpl2nd() : " + readFileName);
-            final String directoryPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getPath() + "/AirA01a/";
-            File filepath = new File(directoryPath.toLowerCase(), readFileName.toLowerCase());
-            InputStream istr = new FileInputStream(filepath);
-
-            byte[] readBuffer = new byte[1024 * 1024];
-            int dataSize = istr.read(readBuffer, 0, readBuffer.length);
-            istr.close();
-
-            for (offsetSize = 4096; offsetSize >= 0; offsetSize--)
+            final byte[] data = receivedData.getData();
+            final Bitmap imageData = BitmapFactory.decodeByteArray(data, offsetSize, (data.length - offsetSize));
+            if (imageData == null)
             {
-                try
-                {
-                    Log.v(TAG, "readImageFileImpl2nd() : readSize is " + dataSize + ", offset : " + offsetSize);
-
-                    byte[] buffer = Arrays.copyOfRange(readBuffer, offsetSize, dataSize - offsetSize);
-
-                    // OpenCVのデータ型に変換
-                    Mat rawData = new Mat(1, buffer.length, CV_8UC3);
-                    rawData.put(0, 0, buffer);
-                    Mat decodedImage = Imgcodecs.imdecode(rawData, IMREAD_COLOR);
-
-                    final Bitmap imageData = Bitmap.createBitmap(decodedImage.width(), decodedImage.height(), Bitmap.Config.ARGB_8888);
-                    Utils.matToBitmap(decodedImage, imageData);
-
-                    Log.v(TAG, "readImageFileImpl2nd() : bitmap is " + imageData.getByteCount() + " bytes.");
-
-                    //////  画像表示を更新する //////
-                    activity.runOnUiThread(new Runnable() {
-                        @Override
-                        public void run() {
-                            try
-                            {
-                                // ビットマップイメージを表示する。
-                                ImageView view = activity.findViewById(R.id.information_view);
-                                view.setImageBitmap(imageData);
-                                view.invalidate();
-                            }
-                            catch (Throwable e)
-                            {
-                                e.printStackTrace();
-                            }
-                        }
-                    });
-                    break;
-                }
-                catch (Throwable t)
-                {
-                    t.printStackTrace();
-                }
+                Log.v(TAG, "readImageFileImpl() : bitmap is NULL. (offset : " + offsetSize + ")");
             }
-            Log.v(TAG, "readImageFileImpl2nd() is finished.");
-            offsetSize = 0;
-        }
-        catch (Throwable e)
-        {
-            e.printStackTrace();
-        }
-    }
-
-
-
-    private Bitmap getBitmap(ReceivedDataHolder receivedData)
-    {
-        Bitmap bitmap;
-        try {
-            final ByteBuffer dataValue = receivedData.getByteBuffer();
-            final int dataLength = receivedData.getLength();
-//            final byte[] imageBytes = Arrays.copyOfRange(dataValue, 18, dataValue.length);
-
-            // OpenCVのデータ型に変換
-            Mat rawData = new Mat( 1,dataLength, CV_8UC3, dataValue);
-            Mat decodedImage = Imgcodecs.imdecode(rawData, IMREAD_COLOR);
-            bitmap = Bitmap.createBitmap(decodedImage.width(), decodedImage.height(), Bitmap.Config.ARGB_8888);
-            org.opencv.android.Utils.matToBitmap(decodedImage, bitmap);
-
-            rawData.release();
-            decodedImage.release();
+            else
+            {
+                Log.v(TAG, "readImageFileImpl() : bitmap is " + imageData.getByteCount() + " bytes.");
+            }
+            return (imageData);
         }
         catch (Exception e)
         {
             e.printStackTrace();
-            bitmap = null;
         }
-        return (bitmap);
+        return (null);
     }
 }
index 190dd5b..535426d 100644 (file)
@@ -1,10 +1,8 @@
 package net.osdn.gokigen.cameratest.fuji;
 
 import android.util.Log;
-
 import androidx.annotation.NonNull;
-
-import java.io.InputStreamReader;
+import java.io.InputStream;
 import java.net.Socket;
 
 class FujiStreamReceiver
@@ -62,13 +60,12 @@ class FujiStreamReceiver
     private void startReceive(Socket socket)
     {
 /**/
-        InputStreamReader isr;
-        char[] char_array;
+        InputStream isr;
+        byte[] byteArray;
         try
         {
-            isr = new InputStreamReader(socket.getInputStream());
-            char_array = new char[BUFFER_SIZE];
-
+            isr = socket.getInputStream();
+            byteArray = new byte[BUFFER_SIZE];
         }
         catch (Exception e)
         {
@@ -95,8 +92,8 @@ class FujiStreamReceiver
                 }
 */
 /**/
-                int read_bytes = isr.read(char_array, 0, BUFFER_SIZE);
-                imageViewer.updateImage(new ReceivedDataHolder(char_array, read_bytes));
+                int read_bytes = isr.read(byteArray, 0, BUFFER_SIZE);
+                imageViewer.updateImage(new ReceivedDataHolder(byteArray, read_bytes));
 /**/
                 Thread.sleep(WAIT_MS);
             }
index e28f0eb..9dae746 100644 (file)
@@ -1,8 +1,5 @@
 package net.osdn.gokigen.cameratest.fuji;
 
-import java.nio.ByteBuffer;
-import java.nio.CharBuffer;
-import java.nio.charset.Charset;
 import java.util.Arrays;
 
 /**
@@ -12,52 +9,13 @@ import java.util.Arrays;
 public class ReceivedDataHolder
 {
     private final byte[] data;
-    private static final int DATA_OFFSET = 18;
 
-    ReceivedDataHolder(byte[] data, int length)
-    {
+    ReceivedDataHolder(byte[] data, int length) {
         this.data = Arrays.copyOfRange(data, 0, length);
-     }
-
-    ReceivedDataHolder(char[] data, int length)
-    {
-        byte[] convertedData = toBytes(data);
-        this.data = Arrays.copyOfRange(convertedData, 0, length);
-    }
-
-    public char[] getCharData()
-    {
-        String text = new String(data);
-        return (text.toCharArray());
     }
 
-    public byte[] getData()
-    {
+    public byte[] getData() {
         return (data);
     }
 
-    public ByteBuffer getByteBuffer()
-    {
-        ByteBuffer dataBuffer = ByteBuffer.allocateDirect(data.length - DATA_OFFSET);
-        dataBuffer.put(Arrays.copyOfRange(data, DATA_OFFSET, (data.length - DATA_OFFSET)));
-        return (dataBuffer);
-    }
-
-    public int getLength()
-    {
-        return (data.length - DATA_OFFSET);
-    }
-
-    /**
-     *   char[]からbyte[]に変換する
-     *    (https://stackoverflow.com/questions/5513144/converting-char-to-byte より)
-     */
-    private byte[] toBytes(char[] chars)
-    {
-        CharBuffer charBuffer = CharBuffer.wrap(chars);
-        ByteBuffer byteBuffer = Charset.forName("UTF-8").encode(charBuffer);
-        byte[] bytes = Arrays.copyOfRange(byteBuffer.array(), byteBuffer.position(), byteBuffer.limit());
-        Arrays.fill(byteBuffer.array(), (byte) 0x00);
-        return (bytes);
-    }
 }
index 4191e20..e9ce3e6 100644 (file)
         android:title="@string/action_wifi_settings"
         app:showAsAction="never" />
     <item
-        android:id="@+id/action_add_value"
+        android:id="@+id/action_up_value"
         android:orderInCategory="100"
-        android:title="@string/action_add"
+        android:title="@string/action_up"
         app:showAsAction="never" />
     <item
-        android:id="@+id/action_delete_value"
+        android:id="@+id/action_down_value"
         android:orderInCategory="100"
-        android:title="@string/action_delete"
+        android:title="@string/action_down"
         app:showAsAction="never" />
 
 </menu>
index 4a22e2a..996cfa3 100644 (file)
@@ -12,6 +12,6 @@
     <string name="label_button3">3</string>
     <string name="label_button4">4</string>
     <string name="label_button5">5</string>
-    <string name="action_add">Add</string>
-    <string name="action_delete">Delete</string>
+    <string name="action_up">Up</string>
+    <string name="action_down">Down</string>
 </resources>