From: MRSa Date: Sun, 8 Sep 2019 15:30:53 +0000 (+0900) Subject: SONYの画像取得のために確認中。いったん保存。 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=c9edf8a0473e23f0a07b33a1f6d8000c47ea790f;p=gokigen%2FPKRemote.git SONYの画像取得のために確認中。いったん保存。 --- diff --git a/app/src/main/java/net/osdn/gokigen/pkremote/camera/CameraInterfaceProvider.java b/app/src/main/java/net/osdn/gokigen/pkremote/camera/CameraInterfaceProvider.java index 0467914..f905717 100644 --- a/app/src/main/java/net/osdn/gokigen/pkremote/camera/CameraInterfaceProvider.java +++ b/app/src/main/java/net/osdn/gokigen/pkremote/camera/CameraInterfaceProvider.java @@ -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); } diff --git a/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/panasonic/wrapper/PanasonicCameraWrapper.java b/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/panasonic/wrapper/PanasonicCameraWrapper.java index 7c37561..2beb2bf 100644 --- a/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/panasonic/wrapper/PanasonicCameraWrapper.java +++ b/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/panasonic/wrapper/PanasonicCameraWrapper.java @@ -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(); } diff --git a/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/panasonic/wrapper/playback/PanasonicPlaybackControl.java b/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/panasonic/wrapper/playback/PanasonicPlaybackControl.java index 7bdd115..3b39323 100644 --- a/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/panasonic/wrapper/playback/PanasonicPlaybackControl.java +++ b/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/panasonic/wrapper/playback/PanasonicPlaybackControl.java @@ -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 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 "LumixLink2.0"; 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 diff --git a/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/sony/wrapper/ISonyCamera.java b/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/sony/wrapper/ISonyCamera.java index 66ab4b5..7562325 100644 --- a/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/sony/wrapper/ISonyCamera.java +++ b/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/sony/wrapper/ISonyCamera.java @@ -9,4 +9,6 @@ public interface ISonyCamera String getFriendlyName(); String getModelName(); + + String getDdUrl(); } diff --git a/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/sony/wrapper/ISonyCameraApi.java b/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/sony/wrapper/ISonyCameraApi.java index 089b2b8..1e23943 100644 --- a/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/sony/wrapper/ISonyCameraApi.java +++ b/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/sony/wrapper/ISonyCameraApi.java @@ -66,4 +66,6 @@ public interface ISonyCameraApi List getSonyApiServiceList(); JSONObject callGenericSonyApiMethod(@NonNull String service, @NonNull String method, @NonNull JSONArray params, @NonNull String version); + + String getDdUrl(); } diff --git a/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/sony/wrapper/SonyCameraApi.java b/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/sony/wrapper/SonyCameraApi.java index 371f974..269c9e4 100644 --- a/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/sony/wrapper/SonyCameraApi.java +++ b/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/sony/wrapper/SonyCameraApi.java @@ -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"))); } + + + + } diff --git a/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/sony/wrapper/SonyCameraDeviceProvider.java b/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/sony/wrapper/SonyCameraDeviceProvider.java index ad4b06e..8f08346 100644 --- a/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/sony/wrapper/SonyCameraDeviceProvider.java +++ b/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/sony/wrapper/SonyCameraDeviceProvider.java @@ -91,6 +91,16 @@ public class SonyCameraDeviceProvider implements ISonyCamera return (modelName); } + /** + * + * + */ + @Override + public String getDdUrl() + { + return (ddUrl); + } + /** * diff --git a/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/sony/wrapper/playback/SonyPlaybackControl.java b/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/sony/wrapper/playback/SonyPlaybackControl.java index 6d99ec6..bccf78a 100644 --- a/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/sony/wrapper/playback/SonyPlaybackControl.java +++ b/app/src/main/java/net/osdn/gokigen/pkremote/camera/vendor/sony/wrapper/playback/SonyPlaybackControl.java @@ -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 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 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(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 = "" + + "" + + //"0" + + "03_01_0002002552_000002_000000_000000" + + "BrowseDirectChildren*" + + "" + returnedCount + "" + + //"3500" + + "1" + + //"" + "-dc:flat" + "" + + "" + "-dc:date" + "" + + ""; +/* + String postData = "" + + "" + + "0BrowseDirectChildren*" + returnedCount + "3500" + + "LumixLink2.0"; +*/ + 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("") + 14, reply.indexOf("")); + try + { + totalCount = Integer.parseInt(matches); + } + catch (Exception e) + { + e.printStackTrace(); + totalCount = 0; + } + + String returned = reply.substring(reply.indexOf("") + 16, reply.indexOf("")); + 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); +*/ + } + } }