2016-06-22 31 views
1

Я использую намерение с действием android.provider.MediaStore.ACTION_IMAGE_CAPTURE, чтобы захватить изображение и получить путь к изображению. После того, как я получил путь, я декодирую его в растровое изображение.Bitmap decode File return null

Bitmap photoBitmap = BitmapFactory.decodeFile(currentPhotoPath); 

Все хорошо работает на DEVICE1, журнал для траекторных изображений выглядеть следующим образом:

/storage/emulated/0/Pictures/QPOS/IMG_20160622_110127_1473532607.jpg 

Затем я запустить приложение на новый вызов устройства устройство2. Путь образ, который я получил после захвата изображения:

/storage/emulated/0/Pictures/QPOS/IMG_20160622_105436_2068195440.jpg 

Это нормальный вид. Но метод декодирования возвращают нулевое растровое изображение на этой линии

Bitmap photoBitmap = BitmapFactory.decodeFile(currentPhotoPath); 

Я не знаю, почему отличаются между двумя устройства, я построю на том же исходном коде. Можете ли вы объяснить, почему я получил нулевое битовое изображение для файла декодирования метода? И как решить эту проблему? Благодарю.

Update: добавить разрешения запроса на API 23 с помощью этого метода:

private void requestPermissions() { 
     Log.d("binh", "request Permision"); 
     if (Build.VERSION.SDK_INT >= 23) { 
      List<String> permissionRequestList = new ArrayList<>(); 

      if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.CAMERA) 
        != PackageManager.PERMISSION_GRANTED) { 
       permissionRequestList.add(android.Manifest.permission.CAMERA); 
      } 

      if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) 
        != PackageManager.PERMISSION_GRANTED) { 
       permissionRequestList.add(android.Manifest.permission.ACCESS_FINE_LOCATION); 
      } 

      if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.READ_EXTERNAL_STORAGE) 
        != PackageManager.PERMISSION_GRANTED) { 
       permissionRequestList.add(android.Manifest.permission.READ_EXTERNAL_STORAGE); 
      } 

      if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE) 
        != PackageManager.PERMISSION_GRANTED) { 
       permissionRequestList.add(android.Manifest.permission.WRITE_EXTERNAL_STORAGE); 
      } 

      if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.READ_PHONE_STATE) 
        != PackageManager.PERMISSION_GRANTED) { 
       permissionRequestList.add(android.Manifest.permission.READ_PHONE_STATE); 
      } 

      if (permissionRequestList.size() > 0) { 
       ActivityCompat.requestPermissions(this, permissionRequestList.toArray(new String[permissionRequestList.size()]), Constants.REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS); 
      } 
     } 
    } 

Это код, чтобы создать путь для изображения:

private File setUpPhotoFile() throws IOException { 
     File f = createImageFile(); 
     currentPhotoPath = f.getAbsolutePath(); 
     return f; 
    } 

    private File createImageFile() throws IOException { 
     String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
     String imageFileName = JPEG_FILE_PREFIX + timeStamp + "_"; 
     File albumF = getAlbumDir(); 
     File imageF = File.createTempFile(imageFileName, JPEG_FILE_SUFFIX, albumF); 
     return imageF; 
    } 

    private File getAlbumDir() { 
     File storageDir = null; 
     if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) { 
      //storageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), getString(R.string.app_name)); 
      storageDir = new File(
        getExternalFilesDir(Environment.DIRECTORY_PICTURES), getString(R.string.app_name)); 
      if (storageDir != null) { 
       if (!storageDir.mkdirs()) { 
        if (!storageDir.exists()) { 
         Log.d("CameraSample", "failed to create directory"); 
         return null; 
        } 
       } 
      } 
     } else { 
      Log.d(getString(R.string.app_name), "External storage is not mounted READ/WRITE."); 
     } 


     return storageDir; 
    } 

После сборки и получили разрешение от диалога , У меня такая же проблема.

+0

Удалось ли вам найти решение? Я читал разные темы в SOF, и у вас точно такие же, как у меня. У каждой другой темы есть «аналогичная проблема», но в конце их решение не распространяется на нашу проблему, не уверен, почему она была помечена как дубликат. Или, может быть, я пропустил хороший? – Laurent

ответ

0

Похоже, что вопрос о альфа-канал, так что вы должны использовать формат растрового изображения, который сохраняет альфа:

проверка ниже код:

BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inPreferredConfig = Bitmap.Config.ARGB_8888; 
    Bitmap photoBitmap = BitmapFactory.decodeFile(currentPhotoPath, options); 
+0

тот же результат – CauCuKien

+0

список ваших уровней API для обоих DEVICE1 и устройство2 здесь пожалуйста – Vickyexpert

+0

device1: Android 5.1, устройство2 (Android 6.0) – CauCuKien

0

Может быть Android SDK ваш DEVICE1 «s и Антенна Android2 sdk == 23 , пожалуйста, проверьте, что разрешение READ_EXTERNAL_STORAGE управляется в соответствии с Android Sdk 23 (в требуемое время).

+0

Возможно, это причина, позвольте мне быстро проверить и отправить обратно – CauCuKien

+0

private boolean mayRequestPermission() { if (Build.VERSION.SDK_INT Andr

+0

Я обновил вопрос, пожалуйста, посмотрите на него. благодаря – CauCuKien