OSDN Git Service

pixpro実装。画像取得も可能にした。
authorMRSa <mrsa@myad.jp>
Sun, 16 Aug 2020 06:59:10 +0000 (15:59 +0900)
committerMRSa <mrsa@myad.jp>
Sun, 16 Aug 2020 06:59:10 +0000 (15:59 +0900)
app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/pixpro/wrapper/playback/PixproCameraContent.java [new file with mode: 0644]
app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/pixpro/wrapper/playback/PixproContentListParser.java [new file with mode: 0644]
app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/pixpro/wrapper/playback/PixproPlaybackControl.java
app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/theta/wrapper/playback/ThetaPlaybackControl.java

diff --git a/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/pixpro/wrapper/playback/PixproCameraContent.java b/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/pixpro/wrapper/playback/PixproCameraContent.java
new file mode 100644 (file)
index 0000000..12563f9
--- /dev/null
@@ -0,0 +1,132 @@
+package net.osdn.gokigen.pkremote.camera.vendor.pixpro.wrapper.playback;
+
+import net.osdn.gokigen.pkremote.camera.interfaces.playback.ICameraContent;
+
+import java.util.Date;
+
+public class PixproCameraContent implements ICameraContent
+{
+    private final String pathRoot;
+    private String name;
+    private String fPath;
+    private String size;
+    private String dateTime;
+    private String dcfIndex;
+    private String attr;
+
+    PixproCameraContent(String pathRoot)
+    {
+        this.pathRoot = pathRoot;
+
+    }
+
+    public void setObjName(String name)
+    {
+        this.name = name;
+    }
+
+    public void setFilePath(String fPath)
+    {
+        this.fPath = fPath;
+    }
+
+    public void setObjSize(String size)
+    {
+        this.size = size;
+    }
+
+    public void setDateTime(String dateTime)
+    {
+        this.dateTime = dateTime;
+    }
+
+    public void setDcfIndex(String dcfIndex)
+    {
+        this.dcfIndex = dcfIndex;
+    }
+
+    public void setAttr(String attr)
+    {
+        this.attr = attr;
+    }
+
+    @Override
+    public String getCameraId()
+    {
+        return ("");
+    }
+
+    @Override
+    public String getCardId()
+    {
+        return ("");
+    }
+
+    @Override
+    public String getContentPath()
+    {
+        try
+        {
+            int index = fPath.lastIndexOf("/");
+            return (fPath.substring(0, index));
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+        return (fPath);
+    }
+
+    @Override
+    public String getContentName()
+    {
+        return (name);
+    }
+
+    @Override
+    public String getOriginalName()
+    {
+        return (name);
+    }
+
+    @Override
+    public boolean isRaw()
+    {
+        return (false);
+    }
+
+    @Override
+    public boolean isMovie()
+    {
+        return (false);
+    }
+
+    @Override
+    public boolean isDateValid()
+    {
+        return (false);
+    }
+
+    @Override
+    public boolean isContentNameValid()
+    {
+        return (false);
+    }
+
+    @Override
+    public Date getCapturedDate()
+    {
+        // ‎2020‎年‎7‎月‎11‎日、 ‏‎8:32:30  が 1357595663 (100_0001.JPG)
+        // ‎2020‎年‎7‎月‎11‎日、 ‏‎8:33:44  が 1357595702 (100_0002.JPG)
+        // ‎2020‎年‎7‎月‎11‎日、 ‏‎8:34:34  が 1357595729 (100_0003.JPG)
+        // ‎2020‎年‎8‎月‎10‎日、‏‎20:43:32  が 1359652208
+
+        return (new Date());
+    }
+
+    @Override
+    public void setCapturedDate(Date date)
+    {
+
+    }
+}
diff --git a/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/pixpro/wrapper/playback/PixproContentListParser.java b/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/pixpro/wrapper/playback/PixproContentListParser.java
new file mode 100644 (file)
index 0000000..eb2cd55
--- /dev/null
@@ -0,0 +1,140 @@
+package net.osdn.gokigen.pkremote.camera.vendor.pixpro.wrapper.playback;
+
+
+import android.util.Log;
+import android.util.Xml;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import net.osdn.gokigen.pkremote.camera.interfaces.playback.ICameraContent;
+
+import org.xmlpull.v1.XmlPullParser;
+
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.List;
+
+class PixproContentListParser
+{
+    private final String TAG = toString();
+    private static final String CAMERACONTENT_TAG = "File";
+    private static final String PATHROOT_TAG = "PATHROOT";
+    private static final String NAME_TAG = "NAME";
+    private static final String FPATH_TAG = "FPATH";
+    private static final String SIZE_TAG = "SIZE";
+    private static final String TIMECODE_TAG = "TIMECODE";
+    private static final String DCFINDEX_TAG = "DCFINDEX";
+    private static final String ATTR_TAG = "ATTR";
+
+    private List<PixproCameraContent> contentList;
+    private String pathRoot;
+
+    PixproContentListParser()
+    {
+        contentList = new ArrayList<>();
+    }
+
+    public List<ICameraContent> parseContentList(@NonNull String receivedMessage)
+    {
+        // 受信したボディを解析して、画像一覧を cameraContentList に入れる
+        List<ICameraContent> cameraContentList = new ArrayList<>();
+        PixproCameraContent cameraContent = null;
+        contentList.clear();
+        try
+        {
+            String tagName = null;
+            XmlPullParser parser = Xml.newPullParser();
+            parser.setInput(new StringReader(receivedMessage));
+            int eventType = parser.getEventType();
+            while (eventType != XmlPullParser.END_DOCUMENT)
+            {
+                if(eventType == XmlPullParser.START_DOCUMENT)
+                {
+                    System.out.println("Start document");
+                }
+                else if(eventType == XmlPullParser.START_TAG)
+                {
+                    tagName = parser.getName();
+                }
+                else if(eventType == XmlPullParser.END_TAG)
+                {
+                    String tag = parser.getName();
+                    if (tag != null)
+                    {
+                        if (tag.matches(CAMERACONTENT_TAG))
+                        {
+                            cameraContentList.add(cameraContent);
+                            contentList.add(cameraContent);
+                            cameraContent = null;
+                        }
+                        Log.v(TAG, "  ----- END TAG : " + tag + "  ------ ");
+                    }
+                    tagName = null;  // parser.getName();
+                }
+                else if(eventType == XmlPullParser.TEXT)
+                {
+                    String content = parser.getText();
+                    if (tagName != null)
+                    {
+                        if (tagName.matches(CAMERACONTENT_TAG))
+                        {
+                            cameraContent = new PixproCameraContent(pathRoot);
+                        }
+                        else
+                        parseData(tagName, content, cameraContent);
+                    }
+                }
+                eventType = parser.next();
+            }
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+        return (cameraContentList);
+    }
+
+    private void parseData(@NonNull String tagName, @Nullable String content, @Nullable PixproCameraContent cameraContent)
+    {
+        Log.v(TAG, "  ----- " + tagName + " : " + content + "  ------ ");
+        try
+        {
+            if (tagName.matches(PATHROOT_TAG))
+            {
+                pathRoot = content;
+            }
+            if (cameraContent != null)
+            {
+                if (tagName.matches(NAME_TAG))
+                {
+                    cameraContent.setObjName(content);
+                }
+                else if (tagName.matches(FPATH_TAG))
+                {
+                    cameraContent.setFilePath(content);
+                }
+                else if (tagName.matches(SIZE_TAG))
+                {
+                    cameraContent.setObjSize(content);
+                }
+                else if (tagName.matches(TIMECODE_TAG))
+                {
+                    cameraContent.setDateTime(content);
+                }
+                else if (tagName.matches(DCFINDEX_TAG))
+                {
+                    cameraContent.setDcfIndex(content);
+                }
+                else if (tagName.matches(ATTR_TAG))
+                {
+                    cameraContent.setAttr(content);
+                }
+            }
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+    }
+}
\ No newline at end of file
index f961595..e2a01ba 100644 (file)
@@ -1,5 +1,6 @@
 package net.osdn.gokigen.pkremote.camera.vendor.pixpro.wrapper.playback;
 
+import android.graphics.Bitmap;
 import android.util.Log;
 
 import androidx.annotation.NonNull;
@@ -12,10 +13,11 @@ import net.osdn.gokigen.pkremote.camera.interfaces.playback.IDownloadContentCall
 import net.osdn.gokigen.pkremote.camera.interfaces.playback.IDownloadContentListCallback;
 import net.osdn.gokigen.pkremote.camera.interfaces.playback.IDownloadThumbnailImageCallback;
 import net.osdn.gokigen.pkremote.camera.interfaces.playback.IPlaybackControl;
+import net.osdn.gokigen.pkremote.camera.playback.ProgressEvent;
 import net.osdn.gokigen.pkremote.camera.utils.SimpleHttpClient;
 import net.osdn.gokigen.pkremote.camera.vendor.pixpro.wrapper.IConnectionKeyProvider;
 
-import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 
 public class PixproPlaybackControl implements IPlaybackControl
@@ -27,15 +29,14 @@ public class PixproPlaybackControl implements IPlaybackControl
     private final IConnectionKeyProvider keyProvider;
     private final int timeoutValue;
 
-    private List<ICameraContent> cameraContentList;
+    private PixproContentListParser contentListParser;
 
     public PixproPlaybackControl(@NonNull String ipAddress, int timeoutMs, @NonNull IConnectionKeyProvider keyProvider)
     {
         this.ipAddress = ipAddress;
         this.keyProvider = keyProvider;
         this.timeoutValue  = Math.max(timeoutMs, DEFAULT_TIMEOUT);
-        cameraContentList = new ArrayList<>();
-
+        contentListParser = new PixproContentListParser();
     }
 
 
@@ -48,37 +49,104 @@ public class PixproPlaybackControl implements IPlaybackControl
     @Override
     public void downloadContentList(IDownloadContentListCallback callback)
     {
-
+        Log.v(TAG, " downloadContentList()");
     }
 
     @Override
     public void getContentInfo(String path, String name, IContentInfoCallback callback)
     {
-
+        Log.v(TAG, " getContentInfo() : " + path + " / " + name);
     }
 
     @Override
     public void updateCameraFileInfo(ICameraFileInfo info)
     {
-
+        Log.v(TAG, " updateCameraFileInfo() : " + info.getFilename());
     }
 
     @Override
     public void downloadContentScreennail(String path, IDownloadThumbnailImageCallback callback)
     {
-
+        downloadContentThumbnail(path, callback);
+/*
+        try
+        {
+            int index = path.indexOf(".");
+            String urlToGet = "http://" + ipAddress + path.substring(0, index) + ".scn?" + getConnectionString();
+            Log.v(TAG, "downloadContentThumbnail() : " + urlToGet);
+
+            Bitmap bmp = SimpleHttpClient.httpGetBitmap(urlToGet, null, timeoutValue);
+            HashMap<String, Object> map = new HashMap<>();
+            map.put("Orientation", 0);
+            callback.onCompleted(bmp, map);
+        }
+        catch (Throwable e)
+        {
+            e.printStackTrace();
+            callback.onErrorOccurred(new NullPointerException());
+        }
+*/
     }
 
     @Override
     public void downloadContentThumbnail(String path, IDownloadThumbnailImageCallback callback)
     {
-
+        try
+        {
+            int index = path.indexOf(".");
+            String urlToGet = "http://" + ipAddress + path.substring(0, index) + ".thm?" + getConnectionString();
+            Log.v(TAG, "downloadContentThumbnail() : " + urlToGet);
+
+            Bitmap bmp = SimpleHttpClient.httpGetBitmap(urlToGet, null, timeoutValue);
+            HashMap<String, Object> map = new HashMap<>();
+            map.put("Orientation", 0);
+            callback.onCompleted(bmp, map);
+        }
+        catch (Throwable e)
+        {
+            e.printStackTrace();
+            callback.onErrorOccurred(new NullPointerException());
+        }
     }
 
     @Override
-    public void downloadContent(String path, boolean isSmallSize, IDownloadContentCallback callback)
+    public void downloadContent(String path, boolean isSmallSize, final IDownloadContentCallback callback)
     {
-
+        try
+        {
+            String urlToGet = "http://" + ipAddress + path + "?" + getConnectionString();
+            if (isSmallSize)
+            {
+                int index = path.indexOf(".");
+                urlToGet = "http://" + ipAddress + path.substring(0, index) + ".scn?" + getConnectionString();
+                urlToGet = urlToGet.toLowerCase();
+                urlToGet = urlToGet.replace("dcim", "scn");
+            }
+            SimpleHttpClient.httpGetBytes(urlToGet, null, timeoutValue, new SimpleHttpClient.IReceivedMessageCallback() {
+                @Override
+                public void onCompleted() {
+                    callback.onCompleted();
+                }
+
+                @Override
+                public void onErrorOccurred(Exception e) {
+                    callback.onErrorOccurred(e);
+                }
+
+                @Override
+                public void onReceive(int readBytes, int length, int size, byte[] data) {
+                    float percent = (length == 0) ? 0.0f : ((float) readBytes / (float) length);
+                    //Log.v(TAG, " onReceive : " + readBytes + " " + length + " " + size);
+                    ProgressEvent event = new ProgressEvent(percent, null);
+                    callback.onProgress(data, size, event);
+                }
+            });
+        }
+        catch (Throwable e)
+        {
+            e.printStackTrace();
+            callback.onErrorOccurred(new NullPointerException());
+        }
     }
 
     @Override
@@ -92,12 +160,11 @@ public class PixproPlaybackControl implements IPlaybackControl
             {
                 // ぬるぽ発行
                 callback.onErrorOccurred(new NullPointerException());
-                cameraContentList.clear();
                 return;
             }
-            // 応答を受信した場合...
+            // 応答を受信した場合...受信データを parseして応答する。
             Log.v(TAG, " RECEIVED CONTENT REPLY : " + receivedMessage.length());
-            parseContentList(receivedMessage);
+            List<ICameraContent> cameraContentList = contentListParser.parseContentList(receivedMessage);
             callback.onCompleted(cameraContentList);
         }
         catch (Exception e)
@@ -109,14 +176,6 @@ public class PixproPlaybackControl implements IPlaybackControl
         }
     }
 
-    private void parseContentList(@NonNull String receivedMessage)
-    {
-        // 受信したボディを解析して、画像一覧を cameraContentList に入れる
-
-
-    }
-
-
     @Override
     public void showPictureStarted()
     {
index df20fc8..b7a3d44 100644 (file)
@@ -42,8 +42,8 @@ public class ThetaPlaybackControl implements IPlaybackControl
 
     public ThetaPlaybackControl(@NonNull Activity activity, int timeoutMs, int maxCount)
     {
-        this.timeoutValue  = (timeoutMs < DEFAULT_TIMEOUT) ? DEFAULT_TIMEOUT : timeoutMs;
-        this.maxCount  = (maxCount < DEFAULT_MAX_COUNT) ? DEFAULT_MAX_COUNT : maxCount;
+        this.timeoutValue  = Math.max(DEFAULT_TIMEOUT, timeoutMs);
+        this.maxCount  = Math.max(maxCount, DEFAULT_MAX_COUNT);
         SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(activity);
         useThetaV21 = preferences.getBoolean(IPreferencePropertyAccessor.USE_OSC_THETA_V21, false);
         cameraContentList = new ArrayList<>();
@@ -188,6 +188,7 @@ public class ThetaPlaybackControl implements IPlaybackControl
         catch (Exception e)
         {
             e.printStackTrace();
+            callback.onErrorOccurred(new NullPointerException());
         }
     }
 
@@ -220,6 +221,7 @@ public class ThetaPlaybackControl implements IPlaybackControl
         catch (Throwable e)
         {
             e.printStackTrace();
+            callback.onErrorOccurred(new NullPointerException());
         }
     }
 
@@ -253,6 +255,7 @@ public class ThetaPlaybackControl implements IPlaybackControl
         catch (Throwable e)
         {
             e.printStackTrace();
+            callback.onErrorOccurred(new NullPointerException());
         }
     }