0

PhoneGap で InAppBrowser のスクリーンショットを作成したいと考えています。私はたくさん検索しましたが、何も見つかりませんでした。これは可能ですか?

私のターゲットは: iOS と Android

4

3 に答える 3

2

メイン ウィンドウのスクリーンショットを撮りたい場合は、cordova スクリーンショット プラグインが役立ちますスクリーンショットはアプリ ストレージに保存されるため、デバイス ギャラリーにアクセスする必要はありません。

しかし、InAppBrowser プラグインを使用して、このような新しいウィンドウを開くと

var ref = window.open('http://www.yoursubwindow.com', '_blank')

のスクリーンショットを撮ることはできませんref

理由:refプレーンな Javascript ブラウザ ウィンドウではなく、InAppBrowserブラウザ ウィンドウへのアクセスが制限されたオブジェクトです。window.navigator特に、コルドバ スクリーンショット プラグインでスクリーンショットを撮るために使用されるJavascript オブジェクトにはアクセスできません。

したがって、 でスクリーンショットを撮るとwindow.navigator.screenshot.save(...)、常に下にあるウィンドウ (メイン ウィンドウ) のスクリーンショットが撮られますが、ref.

ref.navigator.screenshot.save(...)ref.navigatorが定義されていないため、javascript エラーが発生します。

私は今その問題に取り組んでいますが、まだ解決策を見つけていません。だから、見つけたら教えてね!

于 2014-10-01T11:01:11.210 に答える
0

この PhoneGap プラグインは次のことに役立ちます。

cordova-screenshot

https://github.com/gitawego/cordova-screenshot

使用法:

navigator.screenshot.save(function(error,res){
  if(error){
  console.error(error);
  }else{
    console.log('ok',res.filePath);
  }
});
于 2014-09-23T13:35:24.893 に答える
0

コメントに書かれているように、cordova-screenshot プラグインは inAppBrowser で正しく動作しません。それでも、inAppBrowser プラグイン コードでスクリーンショットを実装できます。スタックオーバーフローにはすでにいくつかのソリューションがあります。Android 用に次のコードを使用しました (編集された InAppBrowser.java コード)。

//私のコードでは、ポストメッセージが機能をトリガーするため、一部のポストメッセージでは、データをキャッチして使用しているコルドバにオブジェクトをpostMessageとして返します:画像

public void screenShare(JSONObject obj) {
       final WebView childView = inAppWebView;
       Bitmap bitmap = Bitmap.createBitmap(childView.getWidth(), childView.getHeight(), Bitmap.Config.ARGB_8888);
       Canvas canvas = new Canvas(bitmap);
       childView.draw(canvas);
       int quality = 100;
       ByteArrayOutputStream jpeg_data = new ByteArrayOutputStream();
       if (bitmap.compress(CompressFormat.JPEG, quality, jpeg_data)) {
           byte[] code = jpeg_data.toByteArray();
           byte[] output = Base64.encode(code, Base64.NO_WRAP);
           String js_out = new String(output);
           js_out = "data:image/jpeg;base64," + js_out;
           try {
               obj.put("screen", js_out);
               LOG.d(LOG_TAG, "screen result sending" );
               sendUpdate(obj, true);
           }catch (JSONException ex) {
               LOG.e(LOG_TAG, "data screenshare object passed to postMessage has caused a JSON error.");
           }
       } else{
           LOG.d(LOG_TAG, "No screen result " );
       }
   }

iOs の場合、CDVUIInappBrowser.m を編集しました。機能のトリガーにも postmessage を使用しており、次のコードを使用しました。

//機能の呼び出し:

NSString *imageStr = [self getScreenshot5];

// data:image を返す

- (NSString *)getScreenshot5
{
    UIImage *viewImage = [self captureScreen:self.inAppBrowserViewController.view];
    // For error information
        NSError *error;
        NSFileManager *fileMgr = [NSFileManager defaultManager];
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDirectory = [paths objectAtIndex:0]; // Get documents folder
        NSString *dataPath = [documentsDirectory stringByAppendingPathComponent:@"/IMG_FOLDER"];

        if (![fileMgr fileExistsAtPath:dataPath])
            [[NSFileManager defaultManager] createDirectoryAtPath:dataPath withIntermediateDirectories:NO attributes:nil error:&error]; //Create folder

        //Get the current date and time and set as image name
        NSDate *now = [NSDate date];

        NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
        dateFormatter.dateFormat = @"yyyy-MM-dd_HH-mm-ss";
        [dateFormatter setTimeZone:[NSTimeZone systemTimeZone]];
        NSString *gmtTime = [dateFormatter stringFromDate:now];
        NSLog(@"The Current Time is :%@", gmtTime);

        NSData *imageData = UIImageJPEGRepresentation(viewImage, 0.9); // _postImage is your image file and you can use JPEG representation or PNG as your wish
        int imgSize = imageData.length;
        NSLog(@"SIZE OF IMAGE: %.2f Kb", (float)imgSize/1024);

        NSString *imgfileName = [NSString stringWithFormat:@"%@%@", gmtTime, @".jpg"];
         NSString *imgfilePath= [dataPath stringByAppendingPathComponent:imgfileName];
        return imgfilePath;
}

-(UIImage*)captureScreen:(UIView*) viewToCapture
{
    UIGraphicsBeginImageContext(viewToCapture.bounds.size);
    [viewToCapture.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return viewImage;
}
于 2019-04-16T13:59:36.887 に答える