OSDN Git Service

SONYの画像取得のために確認中。いったん保存。
authorMRSa <mrsa@myad.jp>
Sun, 8 Sep 2019 15:30:53 +0000 (00:30 +0900)
committerMRSa <mrsa@myad.jp>
Sun, 8 Sep 2019 15:30:53 +0000 (00:30 +0900)
app/src/main/java/net/osdn/gokigen/pkremote/camera/CameraInterfaceProvider.java
app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/panasonic/wrapper/PanasonicCameraWrapper.java
app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/panasonic/wrapper/playback/PanasonicPlaybackControl.java
app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/sony/wrapper/ISonyCamera.java
app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/sony/wrapper/ISonyCameraApi.java
app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/sony/wrapper/SonyCameraApi.java
app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/sony/wrapper/SonyCameraDeviceProvider.java
app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/sony/wrapper/playback/SonyPlaybackControl.java

index 0467914..f905717 100644 (file)
@@ -70,7 +70,7 @@ public class CameraInterfaceProvider implements IInterfaceProvider
         ricohGr2 = new RicohGr2InterfaceProvider(context, provider);
         fujiX = new FujiXInterfaceProvider(context, provider, statusListener, informationReceiver);
         sony = new SonyCameraWrapper(context, provider, statusListener, informationReceiver);
-        panasonic = new PanasonicCameraWrapper(context, provider, statusListener);
+        panasonic = new PanasonicCameraWrapper(context, provider, statusListener, informationReceiver);
         this.informationReceiver = informationReceiver;
         this.cameraContentsRecognizer = new CameraContentsRecognizer(context, this);
     }
index 7c37561..2beb2bf 100644 (file)
@@ -6,6 +6,7 @@ import android.util.Log;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 
+import net.osdn.gokigen.pkremote.IInformationReceiver;
 import net.osdn.gokigen.pkremote.camera.interfaces.control.ICameraButtonControl;
 import net.osdn.gokigen.pkremote.camera.interfaces.control.ICameraConnection;
 import net.osdn.gokigen.pkremote.camera.interfaces.control.ICameraRunMode;
@@ -59,7 +60,7 @@ public class PanasonicCameraWrapper implements IPanasonicCameraHolder, IPanasoni
     private PanasonicStatus statusHolder;
     private PanasonicPlaybackControl playbackControl;
 
-    public PanasonicCameraWrapper(final Activity context, final ICameraStatusReceiver statusReceiver , final @NonNull ICameraChangeListener listener)
+    public PanasonicCameraWrapper(final Activity context, final ICameraStatusReceiver statusReceiver , final @NonNull ICameraChangeListener listener, @NonNull IInformationReceiver informationReceiver)
     {
         this.context = context;
         this.provider = statusReceiver;
@@ -67,7 +68,7 @@ public class PanasonicCameraWrapper implements IPanasonicCameraHolder, IPanasoni
         this.buttonControl = new PanasonicButtonControl();
         this.hardwareStatus = new PanasonicHardwareStatus();
         this.statusHolder = new PanasonicStatus();
-        this.playbackControl = new PanasonicPlaybackControl();
+        this.playbackControl = new PanasonicPlaybackControl(context, informationReceiver);
         this.runMode = new PanasonicRunMode();
 
     }
index 7bdd115..3b39323 100644 (file)
@@ -1,10 +1,13 @@
 package net.osdn.gokigen.pkremote.camera.vendor.panasonic.wrapper.playback;
 
+import android.app.Activity;
 import android.graphics.Bitmap;
 import android.util.Log;
 
 import androidx.annotation.NonNull;
 
+import net.osdn.gokigen.pkremote.IInformationReceiver;
+import net.osdn.gokigen.pkremote.R;
 import net.osdn.gokigen.pkremote.camera.interfaces.playback.ICameraContent;
 import net.osdn.gokigen.pkremote.camera.interfaces.playback.ICameraContentListCallback;
 import net.osdn.gokigen.pkremote.camera.interfaces.playback.ICameraFileInfo;
@@ -26,6 +29,8 @@ import java.util.Queue;
 public class PanasonicPlaybackControl implements IPlaybackControl
 {
     private final String TAG = toString();
+    private final Activity activity;
+    private final IInformationReceiver informationReceiver;
     private static final int COMMAND_POLL_QUEUE_MS = 50;
     private IPanasonicCamera panasonicCamera = null;
     private int timeoutMs = 50000;
@@ -35,8 +40,11 @@ public class PanasonicPlaybackControl implements IPlaybackControl
     private Queue<DownloadScreennailRequest> commandQueue;
 
 
-    public PanasonicPlaybackControl()
+    public PanasonicPlaybackControl(@NonNull Activity activity, @NonNull IInformationReceiver informationReceiver)
     {
+        Log.v(TAG, "PanasonicPlaybackControl()");
+        this.activity = activity;
+        this.informationReceiver = informationReceiver;
         contentList = new ArrayList<>();
     }
 
@@ -81,7 +89,8 @@ public class PanasonicPlaybackControl implements IPlaybackControl
                     "<pana:X_FromCP>LumixLink2.0</pana:X_FromCP></u:Browse></s:Body></s:Envelope>";
 
             String reply = SimpleHttpClient.httpPostWithHeader(url, postData, "SOAPACTION", "urn:schemas-upnp-org:service:ContentDirectory:" + sequenceNumber + "#Browse", "text/xml; charset=\"utf-8\"", timeoutMs);
-            if (reply.length() < 10) {
+            if (reply.length() < 10)
+            {
                 Log.v(TAG, postData);
                 Log.v(TAG, "ContentDirectory is FAILURE. [" + sequenceNumber + "]");
                 break;
@@ -108,6 +117,7 @@ public class PanasonicPlaybackControl implements IPlaybackControl
                 e.printStackTrace();
             }
             Log.v(TAG, "  REPLY DATA : (" + matches + "/" + totalCount + ") [" + returned + "/" + returnedCount + "] " + " " + reply.length() + "bytes");
+            informationReceiver.updateMessage(activity.getString(R.string.get_image_list) + " " + returnedCount + "/" + totalCount + " ", false, false, 0);
         }
     }
 
@@ -149,8 +159,6 @@ public class PanasonicPlaybackControl implements IPlaybackControl
     public void updateCameraFileInfo(@NonNull ICameraFileInfo info)
     {
         Log.v(TAG, " updateCameraFileInfo() : " + info.getFilename());
-
-
     }
 
     @Override
index 089b2b8..1e23943 100644 (file)
@@ -66,4 +66,6 @@ public interface ISonyCameraApi
 
     List<String> getSonyApiServiceList();
     JSONObject callGenericSonyApiMethod(@NonNull String service, @NonNull String method, @NonNull JSONArray params, @NonNull String version);
+
+    String getDdUrl();
 }
index 371f974..269c9e4 100644 (file)
@@ -561,8 +561,18 @@ class SonyCameraApi implements ISonyCameraApi
         return (communicateJSON(service, method, params, version, -1));
     }
 
+    @Override
+    public String getDdUrl()
+    {
+        return (sonyCamera.getDdUrl());
+    }
+
     static boolean isErrorReply(JSONObject replyJson)
     {
         return ((replyJson != null && replyJson.has("error")));
     }
+
+
+
+
 }
index ad4b06e..8f08346 100644 (file)
@@ -91,6 +91,16 @@ public class SonyCameraDeviceProvider implements ISonyCamera
         return (modelName);
     }
 
+    /**
+     *
+     *
+     */
+    @Override
+    public String getDdUrl()
+    {
+        return (ddUrl);
+    }
+
 
     /**
      *
index 6d99ec6..bccf78a 100644 (file)
@@ -30,8 +30,7 @@ import org.json.JSONObject;
 import java.util.ArrayList;
 import java.util.HashMap;
 
-public class SonyPlaybackControl implements IPlaybackControl
-{
+public class SonyPlaybackControl implements IPlaybackControl {
     private final String TAG = toString();
     private final Activity activity;
     private final IInformationReceiver informationReceiver;
@@ -40,8 +39,7 @@ public class SonyPlaybackControl implements IPlaybackControl
     private int timeoutMs = 55000;
     private boolean contentListIsCreating = false;
 
-    public SonyPlaybackControl(@NonNull Activity activity, @NonNull IInformationReceiver informationReceiver)
-    {
+    public SonyPlaybackControl(@NonNull Activity activity, @NonNull IInformationReceiver informationReceiver) {
         Log.v(TAG, "SonyPlaybackControl()");
         this.activity = activity;
         this.informationReceiver = informationReceiver;
@@ -59,120 +57,92 @@ public class SonyPlaybackControl implements IPlaybackControl
     }
 
     @Override
-    public void downloadContentList(IDownloadContentListCallback callback)
-    {
+    public void downloadContentList(IDownloadContentListCallback callback) {
         Log.v(TAG, "downloadContentList()");
 
     }
 
     @Override
-    public void getContentInfo(String path, String name, IContentInfoCallback callback)
-    {
+    public void getContentInfo(String path, String name, IContentInfoCallback callback) {
         Log.v(TAG, "getContentInfo()");
     }
 
     @Override
-    public void updateCameraFileInfo(ICameraFileInfo info)
-    {
+    public void updateCameraFileInfo(ICameraFileInfo info) {
         Log.v(TAG, "updateCameraFileInfo()");
     }
 
     @Override
-    public void downloadContentScreennail(String path, IDownloadThumbnailImageCallback callback)
-    {
+    public void downloadContentScreennail(String path, IDownloadThumbnailImageCallback callback) {
         //Log.v(TAG, "downloadContentScreennail()" + path);
-        try
-        {
+        try {
             SonyImageContentInfo content = contentList.get(path.substring(path.indexOf('/') + 1));
-            if (content == null)
-            {
+            if (content == null) {
                 Log.v(TAG, " CONTENT IS NULL... : " + path);
                 return;
             }
-            try
-            {
+            try {
                 String url = content.getSmallUrl();   // Screennail は VGAサイズ
-                if (url.length() < 1)
-                {
+                if (url.length() < 1) {
                     url = content.getThumbnailUrl();  // VGAサイズが取れなかった場合はサムネイルサイズ
                 }
-                if (url.length() > 1)
-                {
+                if (url.length() > 1) {
                     Bitmap bmp = SimpleHttpClient.httpGetBitmap(url, timeoutMs);
                     HashMap<String, Object> map = new HashMap<>();
                     map.put("Orientation", 0);
                     callback.onCompleted(bmp, map);
                 }
-            }
-            catch (Throwable e)
-            {
+            } catch (Throwable e) {
                 e.printStackTrace();
                 callback.onErrorOccurred(new NullPointerException());
             }
-        }
-        catch (Exception e)
-        {
+        } catch (Exception e) {
             e.printStackTrace();
         }
     }
 
     @Override
-    public void downloadContentThumbnail(String path, IDownloadThumbnailImageCallback callback)
-    {
+    public void downloadContentThumbnail(String path, IDownloadThumbnailImageCallback callback) {
         //Log.v(TAG, "downloadContentThumbnail() : " + path);
-        try
-        {
+        try {
             SonyImageContentInfo content = contentList.get(path.substring(path.indexOf('/') + 1));
-            if (content == null)
-            {
+            if (content == null) {
                 Log.v(TAG, " CONTENT IS NULL... : " + path);
                 return;
             }
-            try
-            {
+            try {
                 String url = content.getThumbnailUrl();
-                if (url.length() > 1)
-                {
+                if (url.length() > 1) {
                     Bitmap bmp = SimpleHttpClient.httpGetBitmap(url, timeoutMs);
                     HashMap<String, Object> map = new HashMap<>();
                     map.put("Orientation", 0);
                     callback.onCompleted(bmp, map);
                 }
-            }
-            catch (Throwable e)
-            {
+            } catch (Throwable e) {
                 e.printStackTrace();
                 callback.onErrorOccurred(new NullPointerException());
             }
-        }
-        catch (Exception e)
-        {
+        } catch (Exception e) {
             e.printStackTrace();
         }
     }
 
     @Override
-    public void downloadContent(String path, boolean isSmallSize, final IDownloadContentCallback callback)
-    {
+    public void downloadContent(String path, boolean isSmallSize, final IDownloadContentCallback callback) {
         //Log.v(TAG, "downloadContent() : " + path);
-        try
-        {
+        try {
             SonyImageContentInfo content = contentList.get(path.substring(path.indexOf('/') + 1));
-            if (content == null)
-            {
+            if (content == null) {
                 Log.v(TAG, " CONTENT IS NULL... : " + path);
                 return;
             }
-            try
-            {
+            try {
                 SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(activity);
                 boolean isVgaSize = preferences.getBoolean(IPreferencePropertyAccessor.GET_SMALL_PICTURE_AS_VGA, false);
                 String url = (isSmallSize) ? ((isVgaSize) ? content.getSmallUrl() : content.getLargeUrl()) : content.getOriginalUrl();
-                if (url.length() < 1)
-                {
+                if (url.length() < 1) {
                     url = content.getOriginalUrl();
-                    if (url.length() < 1)
-                    {
+                    if (url.length() < 1) {
                         //  全然だめなら、サムネイルサイズ...
                         url = content.getThumbnailUrl();
                     }
@@ -198,32 +168,24 @@ public class SonyPlaybackControl implements IPlaybackControl
                         callback.onProgress(data, size, event);
                     }
                 });
-            }
-            catch (Throwable e)
-            {
+            } catch (Throwable e) {
                 e.printStackTrace();
                 callback.onErrorOccurred(new NullPointerException());
             }
-        }
-        catch (Exception e)
-        {
+        } catch (Exception e) {
             e.printStackTrace();
         }
     }
 
     @Override
-    public void getCameraContentList(ICameraContentListCallback callback)
-    {
+    public void getCameraContentList(ICameraContentListCallback callback) {
         Log.v(TAG, "getCameraContentList()");
-        try
-        {
-            if (cameraApi == null)
-            {
+        try {
+            if (cameraApi == null) {
                 Log.v(TAG, "CAMERA API is NULL.");
                 return;
             }
-            if (contentListIsCreating)
-            {
+            if (contentListIsCreating) {
                 // すでにコンテントリストを作り始めているので、処理は継続しない。
                 Log.v(TAG, "ALREADY CREATING CONTENT LIST.");
                 return;
@@ -241,8 +203,7 @@ public class SonyPlaybackControl implements IPlaybackControl
             JSONArray resultArray = countObject.getJSONArray("result");
             int objectCount = resultArray.getJSONObject(0).getInt("count");
             Log.v(TAG, "  OBJECT COUNT  : " + objectCount);
-            if (objectCount < 1)
-            {
+            if (objectCount < 1) {
                 // コンテンツ一覧の取得失敗...
                 informationReceiver.updateMessage(activity.getString(R.string.content_is_nothing), true, false, 0);
                 contentListIsCreating = false;
@@ -252,8 +213,7 @@ public class SonyPlaybackControl implements IPlaybackControl
 
             int index = 0;
             // データを解析してリストを作る
-            while ((index >= 0) && (index < objectCount))
-            {
+            while ((index >= 0) && (index < objectCount)) {
                 informationReceiver.updateMessage(activity.getString(R.string.get_image_list) + " " + index + "/" + objectCount + " ", false, false, 0);
 
                 int remainCount = objectCount - index;
@@ -264,98 +224,146 @@ public class SonyPlaybackControl implements IPlaybackControl
                 //paramsObj.put("cnt", (remainCount > 50 ? 50 : remainCount)); // 一括取得数
                 paramsObj.put("view", "flat");
                 paramsObj.put("sort", "descending");
-                try
-                {
+                try {
                     JSONObject responseObject = cameraApi.getContentList(new JSONArray().put(paramsObj));
                     JSONArray resultsArray = responseObject.getJSONArray("result").getJSONArray(0);
                     int nofContents = resultsArray.length();
-                    for (int pos = 0; pos < nofContents; pos++)
-                    {
+                    for (int pos = 0; pos < nofContents; pos++) {
                         //  ひろったデータを全部入れていく
                         SonyImageContentInfo contentInfo = new SonyImageContentInfo(resultsArray.getJSONObject(pos));
                         String contentName = contentInfo.getContentName();
                         //Date createdTime = contentInfo.getCapturedDate();
                         //String folderNo = contentInfo.getContentPath();
-                        if (contentName.length() > 0)
-                        {
+                        if (contentName.length() > 0) {
                             contentList.put(contentName, contentInfo);
                         }
                         //Log.v(TAG, " [" + pos + "] " + "  " + contentName + " " + " " + createdTime + " " + folderNo);
                     }
                     index = index + nofContents;
                     //Log.v(TAG, "  COUNT : " + index);
-                }
-                catch (Exception e)
-                {
+                } catch (Exception e) {
                     e.printStackTrace();
                     break;
                 }
             }
             contentListIsCreating = false;
             informationReceiver.updateMessage(activity.getString(R.string.get_image_list) + " " + index + "/" + objectCount + " ", false, false, 0);
-            if (callback != null)
-            {
+            if (callback != null) {
                 // コレクションを詰めなおして応答する
                 callback.onCompleted(new ArrayList<ICameraContent>(contentList.values()));
             }
-        }
-        catch (Exception e)
-        {
+        } catch (Exception e) {
             e.printStackTrace();
         }
         contentListIsCreating = false;
     }
-    private void changeContentsTransferMode()
-    {
-        try
-        {
-            if (cameraApi == null)
-            {
+
+    private void changeContentsTransferMode() {
+        try {
+            if (cameraApi == null) {
                 return;
             }
             boolean isAvailable = false;
             int maxRetryCount = 10;    // 最大リトライ回数
-            while ((!isAvailable)&&(maxRetryCount > 0))
-            {
+            while ((!isAvailable) && (maxRetryCount > 0)) {
                 isAvailable = setCameraFunction(false);
                 maxRetryCount--;
             }
-            if (maxRetryCount <= 0)
-            {
+            if (maxRetryCount <= 0) {
                 // Retry over
                 informationReceiver.updateMessage(activity.getString(R.string.change_transfer_mode_retry_over), true, true, Color.RED);
+
+                // 試しに呼んでみる。
+                getContentDirectorySoapAction();
             }
 
-        }
-        catch (Exception e)
-        {
+        } catch (Exception e) {
             e.printStackTrace();
         }
     }
 
-    private boolean setCameraFunction(boolean isRecording)
-    {
-        try
-        {
+    private boolean setCameraFunction(boolean isRecording) {
+        try {
             JSONObject reply = cameraApi.setCameraFunction((isRecording) ? "Remote Shooting" : "Contents Transfer");
-            try
-            {
+            try {
                 int value = reply.getInt("result");
                 Log.v(TAG, "CHANGE RUN MODE : " + value);
                 return (true);
-            }
-            catch (Exception ee)
-            {
+            } catch (Exception ee) {
                 ee.printStackTrace();
                 informationReceiver.updateMessage(activity.getString(R.string.change_transfer_mode_retry), false, false, 0);
                 Thread.sleep(500); //  500ms 待つ
             }
-        }
-        catch (Exception e)
-        {
+        } catch (Exception e) {
             e.printStackTrace();
         }
         return (false);
     }
 
+    private void getContentDirectorySoapAction()
+    {
+
+        ////////////  ある程度の数に区切って送られてくる... 何度か繰り返す必要があるようだ  ////////////
+        int sequenceNumber = 0;
+        int totalCount = 100000;
+        int returnedCount = 0;
+        while (totalCount > returnedCount)
+        {
+            Log.v(TAG, "  ===== getContentList() " + sequenceNumber + " =====");
+            sequenceNumber++;
+            String accessUrl = cameraApi.getDdUrl();
+            String url =  accessUrl.substring(0, accessUrl.lastIndexOf("/")) + "/upnp/control/ContentDirectory";
+
+            String postData = "<?xml version=\"1.0\"?><s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">" +
+                    "<s:Body><u:Browse xmlns:u=\"urn:schemas-upnp-org:service:ContentDirectory:" + sequenceNumber + "\">" +
+                    //"<ObjectID>0</ObjectID>" +
+                    "<ObjectID>03_01_0002002552_000002_000000_000000</ObjectID>" +
+                    "<BrowseFlag>BrowseDirectChildren</BrowseFlag><Filter>*</Filter>" +
+                    "<StartingIndex>" + returnedCount + "</StartingIndex>" +
+                    //"<RequestedCount>3500</RequestedCount>" +
+                    "<RequestedCount>1</RequestedCount>" +
+                    //"<SortCriteria>" + "-dc:flat" +  "</SortCriteria>" +
+                    "<SortCriteria>" + "-dc:date" +  "</SortCriteria>" +
+                    "</u:Browse></s:Body></s:Envelope>";
+/*
+            String postData = "<?xml version=\"1.0\" encoding=\"utf-8\" ?><s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\"><s:Body>" +
+                    "<u:Browse xmlns:u=\"urn:schemas-upnp-org:service:ContentDirectory:" + sequenceNumber + "\" xmlns:pana=\"urn:schemas-panasonic-com:pana\">" +
+                    "<ObjectID>0</ObjectID><BrowseFlag>BrowseDirectChildren</BrowseFlag><Filter>*</Filter><StartingIndex>" + returnedCount + "</StartingIndex><RequestedCount>3500</RequestedCount><SortCriteria></SortCriteria>" +
+                    "<pana:X_FromCP>LumixLink2.0</pana:X_FromCP></u:Browse></s:Body></s:Envelope>";
+*/
+            String reply = SimpleHttpClient.httpPostWithHeader(url, postData, "SOAPACTION", "urn:schemas-upnp-org:service:ContentDirectory:" + sequenceNumber + "#Browse", "text/xml; charset=\"utf-8\"", timeoutMs);
+            if (reply.length() < 10)
+            {
+                Log.v(TAG, postData);
+                Log.v(TAG, "ContentDirectory is FAILURE. [" + sequenceNumber + "]");
+                //break;
+            }
+            Log.v(TAG, " < REPLY > " + reply);
+/*
+            getObjectLists = getObjectLists.append(reply);
+            String matches = reply.substring(reply.indexOf("<TotalMatches>") + 14, reply.indexOf("</TotalMatches>"));
+            try
+            {
+                totalCount = Integer.parseInt(matches);
+            }
+            catch (Exception e)
+            {
+                e.printStackTrace();
+                totalCount = 0;
+            }
+
+            String returned = reply.substring(reply.indexOf("<NumberReturned>") + 16, reply.indexOf("</NumberReturned>"));
+            try
+            {
+                returnedCount = returnedCount + Integer.parseInt(returned);
+            }
+            catch (Exception e)
+            {
+                e.printStackTrace();
+            }
+            Log.v(TAG, "  REPLY DATA : (" + matches + "/" + totalCount + ") [" + returned + "/" + returnedCount + "] " + " " + reply.length() + "bytes");
+            informationReceiver.updateMessage(activity.getString(R.string.get_image_list) + " " + returnedCount + "/" + totalCount + " ", false, false, 0);
+*/
+        }
+    }
 }