PhoneGap で InAppBrowser のスクリーンショットを作成したいと考えています。私はたくさん検索しましたが、何も見つかりませんでした。これは可能ですか?
私のターゲットは: iOS と Android
PhoneGap で InAppBrowser のスクリーンショットを作成したいと考えています。私はたくさん検索しましたが、何も見つかりませんでした。これは可能ですか?
私のターゲットは: iOS と Android
メイン ウィンドウのスクリーンショットを撮りたい場合は、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 エラーが発生します。
私は今その問題に取り組んでいますが、まだ解決策を見つけていません。だから、見つけたら教えてね!
この 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);
}
});
コメントに書かれているように、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;
}