2016-11-14 3 views
0

Я хочу снять снимок экрана с другого действия. Когда я просматриваю Bitmap, он показывает NullPointerExcenption. Вот мой кодandroid- Съемка снимок экрана определенного вида программно не работает

View v=LayoutInflater.from(this).inflate(R.layout.score_share, null); 
    layoutScore.setDrawingCacheEnabled(true); 
    Bitmap bm= Bitmap.createBitmap(v.getDrawingCache()); 
    layoutScore.setDrawingCacheEnabled(false); 
    File file= new File(Environment.getExternalStorageDirectory()+"/scs.jpg"); 
    try { 
     FileOutputStream outputStream= new FileOutputStream(file); 
     bm.compress(Bitmap.CompressFormat.JPEG,100, outputStream); 
     outputStream.flush(); 
     outputStream.close(); 

     openScreenshot(file); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
+0

ты упомянул запись разрешения внешнего хранения в Manifest.xml –

+1

ПУБЛИКАЦИИ StackTrace –

+0

Да я добавить разрешения в Манифест –

ответ

0

Если проблема getDrawingCache возвращения нуля, то просто добавьте эти строки коды перед v.buildDrawingCache(true);

v.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), 
      MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); 

v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight()); 

Это предотвратит, что вид имеет размер (0,0) , и из-за этого он становится нулевым.

+1

спасибо :). Это работает для меня –

1

Ниже приведен метод захвата снимка экрана.

public Bitmap getScreenShot(View view) { 
     View screenView = view.getRootView(); 
     screenView.setDrawingCacheEnabled(true); 
     Bitmap bitmap = Bitmap.createBitmap(screenView.getDrawingCache()); 
     screenView.setDrawingCacheEnabled(false); 
     return bitmap; 
} 

Хранить Bitmap в SDCard:

public void store(Bitmap bm, String fileName){ 
    final static String dirPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Screenshots"; 
    File dir = new File(dirPath); 
    if(!dir.exists()) 
     dir.mkdirs(); 
    File file = new File(dirPath, fileName); 
    try { 
     FileOutputStream fOut = new FileOutputStream(file); 
     bm.compress(Bitmap.CompressFormat.PNG, 85, fOut); 
     fOut.flush(); 
     fOut.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

Теперь Накачайте макет и захват снимок экрана

View view=LayoutInflater.from(this).inflate(R.layout.score_share, null); 

Bitmap bmp = getScreenShot(view); 

ВМР является искомым скриншот затем сохранить его в SDCard как

store(bmp, "Screenshot.jpg"); 

Не забудьте добавить разрешения на запись External Storage в манифесте

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

Благодаря этому ответ Capture Screenshot and store to sdcard

+0

Я хочу захватить снимок экрана другого макета, а не этот макет –

+0

@IliasAhmed вы имели в виду, что хотите сделать снимок экрана макета Activity B в Activity A ?? –

+0

Да. B - макет, а A - активность. –