Parcourir la source

Update Android functionality to provide the "captureScreenshot". This will capture the entire screen and all the views currently displayed. This performs a native screen capture so a ref tag is not required.

foxmicha il y a 7 ans
Parent
révision
8df4c24ee3

+ 6
- 1
android/src/main/java/fr/greweb/reactnativeviewshot/RNViewShotModule.java Voir le fichier

@@ -85,13 +85,18 @@ public class RNViewShotModule extends ReactContextBaseJavaModule {
85 85
               file = createTempFile(getReactApplicationContext(), format);
86 86
             }
87 87
             UIManagerModule uiManager = this.reactContext.getNativeModule(UIManagerModule.class);
88
-            uiManager.addUIBlock(new ViewShot(tag, format, compressFormat, quality, width, height, file, result, snapshotContentContainer,reactContext, promise));
88
+            uiManager.addUIBlock(new ViewShot(tag, format, compressFormat, quality, width, height, file, result, snapshotContentContainer,reactContext, getCurrentActivity(), promise));
89 89
         }
90 90
         catch (Exception e) {
91 91
             promise.reject(ViewShot.ERROR_UNABLE_TO_SNAPSHOT, "Failed to snapshot view tag "+tag);
92 92
         }
93 93
     }
94 94
 
95
+    @ReactMethod
96
+    public void captureScreenshot(ReadableMap options, Promise promise) {
97
+        captureRef(-1, options, promise);
98
+    }
99
+
95 100
     private static final String TEMP_FILE_PREFIX = "ReactNative-snapshot-image";
96 101
 
97 102
     /**

+ 11
- 1
android/src/main/java/fr/greweb/reactnativeviewshot/ViewShot.java Voir le fichier

@@ -44,6 +44,7 @@ public class ViewShot implements UIBlock {
44 44
     private Promise promise;
45 45
     private Boolean snapshotContentContainer;
46 46
     private  ReactApplicationContext reactContext;
47
+    private Activity currentActivity;
47 48
 
48 49
     public ViewShot(
49 50
             int tag,
@@ -56,6 +57,7 @@ public class ViewShot implements UIBlock {
56 57
             String result,
57 58
             Boolean snapshotContentContainer,
58 59
             ReactApplicationContext reactContext,
60
+            Activity currentActivity,
59 61
             Promise promise) {
60 62
         this.tag = tag;
61 63
         this.extension = extension;
@@ -67,13 +69,21 @@ public class ViewShot implements UIBlock {
67 69
         this.result = result;
68 70
         this.snapshotContentContainer = snapshotContentContainer;
69 71
         this.reactContext = reactContext;
72
+        this.currentActivity = currentActivity;
70 73
         this.promise = promise;
71 74
     }
72 75
 
73 76
     @Override
74 77
     public void execute(NativeViewHierarchyManager nativeViewHierarchyManager) {
75 78
         OutputStream os = null;
76
-        View view = nativeViewHierarchyManager.resolveView(tag);
79
+        View view = null;
80
+
81
+        if (tag == -1) {
82
+            view = currentActivity.getWindow().getDecorView().findViewById(android.R.id.content);
83
+        } else {
84
+            view = nativeViewHierarchyManager.resolveView(tag);
85
+        }
86
+
77 87
         if (view == null) {
78 88
             promise.reject(ERROR_UNABLE_TO_SNAPSHOT, "No view found with reactTag: "+tag);
79 89
             return;

+ 13
- 0
src/index.js Voir le fichier

@@ -114,6 +114,19 @@ export function releaseCapture(uri: string): void {
114 114
   }
115 115
 }
116 116
 
117
+export function captureScreenshot(
118
+  optionsObject?: Options
119
+): Promise<string> {
120
+  const { options, errors } = validateOptions(optionsObject);
121
+  if (__DEV__ && errors.length > 0) {
122
+    console.warn(
123
+      "react-native-view-shot: bad options:\n" +
124
+        errors.map(e => `- ${e}`).join("\n")
125
+    );
126
+  }
127
+  return RNViewShot.captureScreenshot(options);
128
+}
129
+
117 130
 type Props = {
118 131
   options?: Object,
119 132
   captureMode?: "mount" | "continuous" | "update",