Как я могу программно сделать скриншот веб-просмотра, захватив полную страницу?
Я думаю, что заголовок почти полностью охватывает его, но у меня есть веб-просмотр в моей деятельности. Я загрузил URL-адрес в веб-просмотр, и я хотел бы сделать снимок экрана с полной страницы (независимо от того, что находится в области просмотра и материала "под слоем" ).
У меня есть код, который работает для моментального снимка области просмотра, и я знаю, что это можно сделать в iOS, увеличив веб-представление перед его снимком. Я попытался использовать ту же технику здесь:
WebView browserView = (WebView) findViewById(R.id.browserView);
//Resize the webview to the height of the webpage
int pageHeight = browserView.getContentHeight();
LayoutParams browserParams = browserView.getLayoutParams();
browserView.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, pageHeight));
//Capture the webview as a bitmap
browserView.setDrawingCacheEnabled(true);
Bitmap bitmap = Bitmap.createBitmap(browserView.getDrawingCache());
browserView.setDrawingCacheEnabled(false);
//Create the filename to use
String randomFilenamepart = String.valueOf(new SecureRandom().nextInt(1000000));
String filename = Environment.getExternalStorageDirectory().toString() + "/Screenshot_" + randomFilenamepart + ".jpg";
File imageFile = new File(filename);
//Stream the file out to external storage as a JPEG
OutputStream fout = null;
try {
fout = new FileOutputStream(imageFile);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fout);
fout.flush();
fout.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
browserView.setLayoutParams(browserParams);
}
Но я все еще только фиксирую только окно просмотра. Не считая таких вещей, как нехватка памяти, потому что страница слишком велика, кто-нибудь знает, что я делаю неправильно, или как я могу включить часть за пределами области просмотра?
Ответы
Ответ 1
Попробуй это
import java.io.FileOutputStream;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Picture;
import android.os.Bundle;
import android.view.Menu;
import android.webkit.WebView;
import android.webkit.WebViewClient;
public class MainActivity extends Activity {
WebView w ;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
w = new WebView(this);
w.setWebViewClient(new WebViewClient()
{
public void onPageFinished(WebView view, String url)
{
Picture picture = view.capturePicture();
Bitmap b = Bitmap.createBitmap( picture.getWidth(),
picture.getHeight(), Bitmap.Config.ARGB_8888);
Canvas c = new Canvas( b );
picture.draw( c );
FileOutputStream fos = null;
try {
fos = new FileOutputStream( "mnt/sdcard/yahoo.jpg" );
if ( fos != null )
{
b.compress(Bitmap.CompressFormat.JPEG, 100, fos);
fos.close();
}
}
catch( Exception e )
{
}
}
});
setContentView(w);
w.loadUrl("http://search.yahoo.com/search?p=android");
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
Добавьте INTERNET PERMISSION и WRITE_EXTERNAL_STORAGE в файл AndroidManifest.xml.
Необходимо запросить разрешение во время выполнения для записи в файл, если приложение работает на или выше Marshmallow.
Ответ 2
@avinash thakur коды действительно работают, вы просто забываете упомянуть, чтобы добавить <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
в файле манифеста Android, в противном случае андроид не позволит потоку записывать данные/файл на устройство.
приветствий.
Ответ 3
https://github.com/peter1492/LongScreenshot посмотрите, полезно ли это. получил код из некоторых ресурсов и библиотеки, сумел загрузить его на GitHub для использования. если он будет полезен, он будет опубликован, иначе он будет удален.
Ответ 4
webview.capturePicture() устарела, используйте следующий способ:
Bitmap bitmap = Bitmap.createBitmap(webview.getWidth(), webview.getHeight(), Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
webview.draw(canvas);
return bitmap;