2013-03-18 5 views
1

У меня есть следующий способ захвата экрана по действию Item Click. Его работа над Android < 2.3, но не на 4+. Что не так с этим способом захвата экрана.Capture Screen Programmatically не работает

private void captureScreen() { 
    View v = mapView.getRootView(); 
    v.setDrawingCacheEnabled(true); 
    Bitmap capturedBitmap = Bitmap.createBitmap(v.getDrawingCache()); 
    v.setDrawingCacheEnabled(false); 

    if(capturedBitmap != null) { 
     Intent intent = new Intent(this, ScreenCapturedAlertActivity.class); 
     intent.putExtra("capturedImage", capturedBitmap); 
     intent.putExtra("name", location.getName()); 
     startActivity(intent); 
    } else { 
     Toast.makeText(this, "Screen Capture Failed", Toast.LENGTH_SHORT).show(); 
    } 
} 

ScreenCaputureAlertActivity.java >>>

public class ScreenCapturedAlertActivity extends SherlockActivity { 

private ImageView capturedImage; 
private Bitmap capturedBitmap; 
private String name; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 

    setContentView(R.layout.activity_screencaptured_alert); 

    capturedBitmap = (Bitmap) getIntent().getParcelableExtra("capturedImage"); 
    name = getIntent().getStringExtra("name"); 

    capturedImage = (ImageView) findViewById(R.id.ivCapturedImage); 
    capturedImage.setImageBitmap(capturedBitmap); 
} 

private void saveAndShare(boolean share) { 
    String root = Environment.getExternalStorageDirectory().toString(); 
    File dir = new File(root + "/capture/"); 
    if(!dir.exists()) 
     dir.mkdirs(); 

    FileOutputStream outStream = null; 
    Random generator = new Random(); 
    int n = 10000; 
    n = generator.nextInt(n); 
    File file = new File(dir, "Capture "+n+".jpg"); 
    if(file.exists()) { 
     file.delete(); 
    } 
    try { 
     outStream = new FileOutputStream(file); 

     capturedBitmap.compress(Bitmap.CompressFormat.JPEG, 100, outStream); 

     outStream.flush(); 
     outStream.close(); 

    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
     Toast.makeText(this, "Save Failed", Toast.LENGTH_SHORT).show(); 
     return; 
    } catch (IOException e) { 
     e.printStackTrace(); 
     Toast.makeText(this, "Save Failed", Toast.LENGTH_SHORT).show(); 
     return; 
    } 

    if(share) { 
     Uri screenshotUri = Uri.fromFile(file); 
     Intent intent = new Intent(Intent.ACTION_SEND); 
     intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     intent.putExtra(Intent.EXTRA_STREAM, screenshotUri); 
     intent.putExtra(Intent.EXTRA_SUBJECT, "Location of " + name); 
     intent.putExtra(Intent.EXTRA_TITLE, getText(R.string.screen_share_message)); 
     intent.putExtra(Intent.EXTRA_TEXT, getText(R.string.screen_share_message)); 
     intent.setType("image/*"); 
     startActivity(Intent.createChooser(intent, "Share with")); 
     finish(); 
    } else { 
     Toast.makeText(this, "Save Success", Toast.LENGTH_SHORT).show(); 

     sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,Uri.parse("file://" + Environment.getExternalStorageDirectory()))); 
     finish(); 
    } 
} 

public void saveCapture(View view) { 
    saveAndShare(false); 
} 

public void shareCapture(View view) { 
    saveAndShare(true); 
} 

}

+0

кажется, что ScreenCapturedAlertActivity не является частью SDK. укажите исходный код. –

+0

@ShailendraRajawat посмотреть исходный код. Это всего лишь активность, чтобы получить растровое изображение и показать его в моде Alert. Все в порядке на Android 2.3, но не работает в 4 и 4+ –

+0

Итак, вы получаете пустое изображение? Или любые ошибки? –

ответ

1

Благодаря руководству @KumarBibek.

Ошибка я получаю был

!!! FAILED BINDER TRANSACTION !!! 

Так, как от выбранного ответа из ссылки

Send Bitmap as Byte Array

Я сделал, как это в первой деятельности:

private void captureScreen() { 
    View v = mapView.getRootView(); 
    v.setDrawingCacheEnabled(true); 
    Bitmap capturedBitmap = Bitmap.createBitmap(v.getDrawingCache()); 
    v.setDrawingCacheEnabled(false); 

    ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
    capturedBitmap.compress(Bitmap.CompressFormat.PNG, 100, stream); 
    byte[] byteArray = stream.toByteArray(); 

    if(capturedBitmap != null) { 
     Intent intent = new Intent(this, ScreenCapturedAlertActivity.class); 
     intent.putExtra("capture", byteArray); 
     intent.putExtra("name", location.getName()); 
     startActivity(intent); 
    } else { 
     Toast.makeText(this, "Screen Capture Failed", Toast.LENGTH_SHORT).show(); 
    } 

} 

И в ScreenCapturedAlertActivity:

byte[] byteArray = getIntent().getByteArrayExtra("capture"); 
     capturedBitmap = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length); 

Сейчас работает ХОРОШО. Еще раз спасибо @KumarBibek

1

Вместо того чтобы передавать весь битмап, попробуйте передать путь к файлу сохраненный файл к следующей операции. Растровое изображение - это большой объект, и он не должен проходить таким образом.

Поскольку вы уже проверили, что изображение будет сохранено в порядке, если вы имеете дело с путями вместо растровых изображений, я думаю, что это решит вашу проблему.

 Смежные вопросы

  • Нет связанных вопросов^_^