2016-03-02 24 views
7

Próbuję załadować zrzut ekranu z mojego Environment.getExternalStorageDirectory() i spróbować go przekonwertować do bitmapyAndroid PNG do Bitmap --- SkImageDecoder :: Fabryka wróciła zerowy

public void onPictureTaken(String path) throws IOException { 

    String photoPath = filepath + "/" + path;; //UPDATE WITH YOUR OWN JPG FILE 

    File directory = new File (filepath); 
    File file = new File(directory, path); 

    final BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inJustDecodeBounds = true; 
    BitmapFactory.decodeFile(photoPath, options); 

    // Calculate inSampleSize 
    options.inSampleSize = 4; 
    options.inJustDecodeBounds = false; 
    BitmapFactory.decodeFile(photoPath, options); 

} 

- - SkImageDecoder :: Fabryka wróciła zerowy

Oto moja funkcja, która zwraca onPictureTaken:

private void observeSceenshot(){ 
    filepath = Environment.getExternalStorageDirectory() 
      + File.separator + Environment.DIRECTORY_PICTURES 
      + File.separator + "Screenshots"; 
    Log.d(TAG, filepath); 

    FileObserver fileObserver = new FileObserver(filepath, FileObserver.CREATE) { 
     @Override 
     public void onEvent(int event, String path) { 
      Log.d(TAG, event + " " + path); 
      try { 
       onPictureTaken(path); 
      } catch (FileNotFoundException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    }; 

    fileObserver.startWatching(); 
} 

Czy ktoś wie, jak rozwiązać problem? Może dlatego, że mój png jest duży (1280x720)? Próbowałem też to rozwiązanie z takim samym skutkiem: http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

EDIT: Oto log

03-02 11: 56: 19,806 11581-11716/com.example.chilred_pc.myapplication D/DBG_com.example.chilred_pc.myapplication.ObserveScreenshots: 256 Screenshot_2016-03-02-11-56-19.png 03-02 11: 56: 19.806 11581-11716/com.example.chilred_pc.myapplication D/katalog:/storage/emulated/0/Obrazy/Zrzuty ekranu 03-02 11: 56: 19.806 11581-11716/com.example.chilred_pc.myapplication D/file:/storage/emulated/0/Zdjęcia/Zrzuty ekranu/Screenshot_2016-03-01-16 -38-08.png 03-02 11: 56: 19.806 11581-11716/com.example.chilred_pc.myapplication D/fileSize: 35061 03-02 11: 56: 19.807 11581-11716/com.example.chilred_pc.myapplication D/skia: - - SkImageDecoder :: Fabryka wróciła zerowy 03-02 11: 56: 19,808 11581-11716/com.example.chilred_pc.myapplication D/skia --- decoder-> dekodowania zwrócone false

+0

upewnij się, że wyrażają zgodę na WRITE_EXTERNAL_STORAGE i WRITE_EXTERNAL_STORAGE w AndroidManifest.xml. Proszę zaksięgować swój dziennik błędów. – pRaNaY

+0

co otrzymasz, gdy wykonasz 'int fileSize = file.length()'? jaka jest wartość pliku fileSize – Bhargav

+0

Napisałem go już w androidmanifest.xml. – Maddin

Odpowiedz

1

Myślę, że rozwiązanie tego problemu polega na tym, że zrzut ekranu potrzebuje kilku sekund, aby utworzyć zdjęcie. Więc próbowałem zatrzymać system na kilka sekund, a teraz działa.

> SystemClock.sleep(3000); 

Ale w końcu użyłem innego sposobu, który jest pokazany tutaj: Detect only screenshot with FileObserver Android

0

Zamiast podano instrukcja wartość options.inSampleSize = 4 obliczyć InSampleSize jak poniżej:

... 
int reqWidth=100; // give your requested width 
int reqHeight=100;// give your requested height 
options.inSampleSize = calculateSampleSize(options,reqWidth,reqHeight); 
... 

public static int calculateSampleSize(BitmapFactory.Options options, 
     int reqWidth, int reqHeight) { 

    final int width = options.outWidth; 
    final int height = options.outHeight; 
    int inSampleSize = 1; 

    if (width > reqWidth || height > reqHeight) { 
     if (width > height) { 
      inSampleSize = Math.round((float) height/(float) reqHeight); 
     } else { 
      inSampleSize = Math.round((float) width/(float) reqWidth); 
     } 
    } 
    return inSampleSize; 
} 

oblicz InSampleSize podane na samym like którego się odnosimy.

+0

Próbowałem tego, ale to nic nie zmienia – Maddin