2016-11-04 4 views
-4

Мне нужно сделать снимок экрана, который я кодировал на экране результатов моей игры.NullPointerException при попытке сделать снимок экрана программно

Я использовал следующий метод, который я нашел в StackOverflow:

public void TakeScreenShot(){ 
    Date now = new Date(); 
    android.text.format.DateFormat.format("yyyy-MM-dd_hh:mm:ss", now); 

    try { 
     String mPath = Environment.getExternalStorageDirectory().toString() + "/PICTURES/Screenshots/" + now + ".jpg"; 

     v1 = this.findViewById(android.R.id.content).getRootView(); 
     v1.setDrawingCacheEnabled(true); 
     bitmap = Bitmap.createBitmap(v1.getDrawingCache()); 
     v1.setDrawingCacheEnabled(false); 

     File imageFile = new File(mPath); 

     FileOutputStream outputStream = new FileOutputStream(imageFile); 
     int quality = 100; 
     bitmap.compress(Bitmap.CompressFormat.JPEG, quality, outputStream); 
     outputStream.flush(); 
     outputStream.close(); 

     Toast.makeText(this, "Screenshot OK", Toast.LENGTH_SHORT).show(); 

    } catch (Throwable e) { 
     e.printStackTrace(); 
    } 
} 

, но я получаю NullPointerException в Bitmap.CreateBitmap.

Мои растровые изображения и представления являются глобальными, и я пытаюсь вызвать метод в OnCreate.

11-04 15: 20: 17,868 13569-13569/com.finger W/System.err: java.lang.NullPointerException

Как я могу решить эту проблему?

Я НАЙДЕНО РЕШЕНИЕ!

Я пытаюсь вызвать метод takeScreenshot в OnCreate и всегда я получил тот же результат все разные вариации, но я стараюсь метод вызова в «Share Button» нажмите событие, теперь его работу. Спасибо.

+3

'v1' или' v1.getDrawingCache() 'будет' null'. Проверьте перед использованием. Или вы ошибаетесь в фактической строке кода. – greenapps

+0

Привет @greenapps, я проверяю, если statment и мой v1.getDrwaingCache возвращают null каждый раз, но я получил тот же результат. К сожалению, –

ответ

0

Я столкнулся с этой проблемой один раз. попробуйте использовать этот

v.setDrawingCacheEnabled(true); 


// Without it the view will have a dimension of 0,0 and the bitmap will be null   
v.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), 
     MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); 
v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight()); 

v.buildDrawingCache(true); 
Bitmap b = Bitmap.createBitmap(v.getDrawingCache()); 
v.setDrawingCacheEnabled(false); 
+0

Я получаю NullPointerException в строке 96, а моя строка 96: v1.setDrawingCacheEnabled (true); –

+0

попробуйте эти параметры: http://stackoverflow.com/a/8817003/1515467 –

+0

Здравствуйте @Manas, Я пробовал все эти параметры, но каждый раз, когда у меня был такой же результат, CreateBitMap NullPointer. –

0

Попробуйте этот код:

private void takeScreenshot() { 
     Date now = new Date(); 
     android.text.format.DateFormat.format("yyyy-MM-dd_hh:mm:ss", now); 

     try { 
      // image naming and path to include sd card appending name you choose for file 
      String mPath = Environment.getExternalStorageDirectory().toString() + "/" + now + ".jpg"; 

      // create bitmap screen capture 
      View v1 = getWindow().getDecorView().getRootView(); 
      v1.setDrawingCacheEnabled(true); 
      Bitmap bitmap = Bitmap.createBitmap(v1.getDrawingCache()); 
      v1.setDrawingCacheEnabled(false); 

      File imageFile = new File(mPath); 

      FileOutputStream outputStream = new FileOutputStream(imageFile); 
      int quality = 100; 
      bitmap.compress(Bitmap.CompressFormat.JPEG, quality, outputStream); 
      outputStream.flush(); 
      outputStream.close(); 

      openScreenshot(imageFile); 
     } catch (Throwable e) { 
      // Several error may come out with file handling or OOM 
      e.printStackTrace(); 
     } 
    } 

И это, как вы можете открыть недавно созданный образ:

private void openScreenshot(File imageFile) { 
    Intent intent = new Intent(); 
    intent.setAction(Intent.ACTION_VIEW); 
    Uri uri = Uri.fromFile(imageFile); 
    intent.setDataAndType(uri, "image/*"); 
    startActivity(intent); 
} 

Если вы хотите использовать это на просмотр фрагмента затем использование:

View v1 = getActivity().getWindow().getDecorView().getRootView(); 

вместо

View v1 = getWindow().getDecorView().getRootView(); 
+0

Это тот же код ... –

+0

У меня такой же результат. –

+0

Вы заменили эту строку View v1 = getWindow(). GetDecorView(). GetRootView(); – siddhesh