Я пытаюсь сделать снимок экрана SurfaceView, но он всегда является результатом черного экрана. Я искал, но все решения, которые я нашел, не работают на меня. Это мой код.Снимок экрана SurfaceView в Android
Это метод, который я называю, чтобы сделать снимок экрана
private void takePicture(){
if(camera!=null) {
camera.takePicture(null, null, jpgCb);
}
}
Это Jpg CallBack
jpgCb=new Camera.PictureCallback() {
@Override
public void onPictureTaken(final byte[] data, final Camera camera) {
btnAccept.setVisibility(View.VISIBLE);
btnCancel.setVisibility(View.VISIBLE);
btnFlash.setEnabled(false);
btnAccept.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
stopCamera();
new AsyncTask<byte[], String, Void>() {
@Override
protected void onPreExecute() {
progressDialog=new ProgressDialog(CameraActivity.this);
progressDialog.setCancelable(false);
progressDialog.setTitle(getResources().getString(R.string.saving_process));
progressDialog.show();
}
@Override
protected void onProgressUpdate(String... values) {
progressDialog.setMessage(values[0]);
}
@Override
protected Void doInBackground(byte[]... params) {
byte[] data=params[0];
File fileDir=new File(Environment.getExternalStorageDirectory().getAbsolutePath() +File.separator+"folder"+File.separator+folderName);
if (!fileDir.exists())
fileDir.mkdirs();
File tmpFile=new File(fileDir,"tmpFile.jpeg");
try{
FileOutputStream fos=new FileOutputStream(tmpFile);
fos.write(data);
fos.close();
}catch (FileNotFoundException e){
Toast.makeText(getApplicationContext(),"Error",Toast.LENGTH_SHORT).show();
}catch (IOException e){
Toast.makeText(getApplicationContext(),"Error",Toast.LENGTH_SHORT).show();
}
BitmapFactory.Options options=new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
tmpFile.delete();
takeScreenshot();
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
try{
pics=loadPics();
setGallery();
}catch (NullPointerException e){
e.printStackTrace();
}
Toast.makeText(getApplicationContext(),getResources().getString(R.string.image_saved),Toast.LENGTH_SHORT).show();
if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE){
startCamera(w,h);
}else
startCamera();
btnAccept.setVisibility(View.GONE);
btnCancel.setVisibility(View.GONE);
btnFlash.setEnabled(true);
progressDialog.dismiss();
}
}.execute(data);
}
});
btnCancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
stopCamera();
if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE){
startCamera(w,h);
}else
startCamera();
btnAccept.setVisibility(View.GONE);
btnCancel.setVisibility(View.GONE);
btnFlash.setEnabled(true);
}
});
}
};
И это метод, который я называю в функцию обратного вызова, который действительно снимает скриншот
public void takeScreenshot(){
cameraContainer.setDrawingCacheEnabled(true);
cameraContainer.buildDrawingCache(true);
Bitmap bmp=Bitmap.createBitmap(cameraContainer.getDrawingCache());
cameraContainer.setDrawingCacheEnabled(false);
ByteArrayOutputStream bos=new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.JPEG,qualityValue,bos);
byte[] bitmapData=bos.toByteArray();
ByteArrayInputStream fis=new ByteArrayInputStream(bitmapData);
String fileName=System.currentTimeMillis()+".jpeg";
File fileDir=new File(Environment.getExternalStorageDirectory().getAbsolutePath() +File.separator+"folder"+File.separator+folderName);
if (!fileDir.exists())
fileDir.mkdirs();
try{
File tmpFile=new File(fileDir,fileName);
FileOutputStream fos=new FileOutputStream(tmpFile);
byte[] buf=new byte[1024];
int len;
while ((len=fis.read(buf))>0) {
fos.write(buf, 0, len);
}
fis.close();
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
С этим я могу сохранить «SurfaceView content» в файле и сохранить его, но контент полностью черный.
PS: Это вопрос, который я больше всего найти при попытке решить мою проблему (на самом деле, метод «takeScreenshot» от этого ответа)
EDIT: Это метод stopCamera
private void stopCamera(){
camera.setPreviewCallback(null);
camera.stopPreview();
camera.release();
camera=null;
}
отредактируйте и добавьте исходный код stopCamera –
Возможный дубликат http://stackoverflow.com/questions/27817577/android-take-screenshot-of-surface-view-shows-black-screen/ – fadden