2015-03-06 2 views
0

Я пытаюсь вынести фото я взял с следующий класс, который возвращает используемый файл:Android; BitmapFactory.decodeFile (файл) возвращает нуль, файл, как известно, существует

public File takePhoto(){ 
    Intent pictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    File destination= null; 
    try { 
     destination = createFile(); 
    } catch (IOException error) { 
     Log.v(TAG, "IO error, reading exception"); 
     String errorMessage = error.getMessage(); 
     Log.v(TAG, errorMessage); 
     String errorCauseMessage = error.getCause().getMessage(); 
     Log.v(TAG, errorCauseMessage); 
    } 
    if (destination != null){ 
     Log.v(TAG, "destination was written"); 
     pictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(destination)); 
     parentActivity.startActivityForResult(pictureIntent, REQUEST_TAKE_PHOTO); 
     Log.v(TAG, "destination was: " + destination.getAbsolutePath()); 
    } 
    else { 
     Log.v(TAG, "destination was not written"); 
    }`` 
    return destination; 

Результат затем используется в следующий код:

Log.v(TAG, "adding picture"); 
      PhotoHandler photoHandler = new PhotoHandler(getPackageManager(), PolishCreateActivity.this); 
      File imgFile = photoHandler.takePhoto(); 
      if (imgFile == null) { 
       Toast.makeText(this, ERROR_TOAST_TEXT, Toast.LENGTH_SHORT).show(); 
      } else { 
       Log.v(TAG, "Picture added"); 

       Log.v(TAG, "storing directory"); 
       img = imgFile.getAbsolutePath(); 
       Log.v(TAG, "Directory stored"); 

       Log.v(TAG, "Displaying picture"); 
       LinearLayout layout = (LinearLayout) findViewById(R.id.rootLayout); 
       if (imageViewExists == Boolean.TRUE) { 
        ImageView oldView = (ImageView) findViewById(R.id.imageViewID); 
        layout.removeView(oldView); 
       } 
       UIHelper uiHelper = new UIHelper(this.getApplicationContext()); 
       ImageView imageView = uiHelper.getImageViewFromPath(imgFile); 
       imageView.setId(R.id.imageViewID); 
       layout.addView(imageView); 
       imageViewExists = Boolean.TRUE; 
       Log.v(TAG, "picture displayed"); 

И перешел к этому методу, так как imgFile:

public ImageView getImageViewFromPath(File imgFile) { 
    ImageView imageView = new ImageView(context); 
    Bitmap imgBM = null; 
    if (imgFile.exists()) { 
     Log.v(TAG, "image file exists"); 
     imgBM = BitmapFactory.decodeFile(imgFile.getAbsolutePath()); 
     if (imgBM == null){ 
      Log.v(TAG, "Bitmap returned was null"); 
     } 
    } 
    imageView.setImageBitmap(imgBM); 
    imageView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); 
    Log.v(TAG, "ImageView was created"); 
    return imageView; 
} 

проблема заключается в том, что BitmapFactory.decode Файл (imgFile.getAbsolutePath) возвращается каждый раз, когда я его запускаю, даже несмотря на то, что файл существует (я могу сказать, потому что получаю сообщения журнала в блоке if ifm imgFile.exists()). Я долго искал решение, но я не нашел решения. Я тестировал, что это не вызывает исключение outOfMemory, которого нет. Любая помощь будет оценена по достоинству.

+0

Может вы лучше используете свою проблему? –

+0

Вы уверены: imgFile не имеет значения. И getAbsolutePath() возвращает правильный путь и не является ни пустой, ни пустой? –

+0

Да, imgFile не равно null, а getAbsolutePath() возвращает правильный путь. –

ответ

0

takePhoto начинает деятельность в результате:

parentActivity.startActivityForResult(pictureIntent, REQUEST_TAKE_PHOTO); 

Но ваш код ведет, как это было сделано мгновенно, что это не так. Файл, конечно, будет там, но он всегда будет 0 байтов.

Вам необходимо переопределить onActivityResult() и обработать содержимое файла оттуда.

+0

Я проверил в файловом менеджере; Файлы существуют, имеют несколько сотен килобайт и могут быть просмотрены на устройстве. Однако я не вижу их на своем компьютере. –

+0

Я основывал это [этот учебник] (http://developer.android.com/training/camera/photobasics.html), в котором указывалось, что изображение будет сохранено без необходимости получения результата onActivity. Не могли бы вы объяснить, почему это было бы неправильно и что я должен делать вместо этого? –

+0

Да, файл будет сохранен новой Деятельностью, но это произойдет * впоследствии. Новая операция захвата изображения не будет видна до тех пор, пока не закончится текущая активность (из которой вы вызываете 'startActivityForResult'). Итак, когда вы сразу же пытаетесь отобразить содержимое файла, там ничего нет - пока!Вы должны дождаться, когда новый Activity выполнит свою работу, и это будет выполнено путем переопределения 'onActivityResult'. –

0

Проверьте значение imgFile.getAbsolutePath().

Возможно, это значение является недействительным или незаконным.

Используйте режим отладки или зарегистрируйте это значение для регистрации cat.

+0

Я зарегистрировал эти значения, и он указывает на файл в/storage/sdcard0/pictures/PolishApp *. Я могу просмотреть эти файлы в файловом менеджере на устройстве, но не на файловом менеджере на моем компьютере. –

0

Хорошо, я решил это, переключившись на получение растрового изображения с намерением через onActivityResult.

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK){ 
     Bundle extras = data.getExtras(); 
     photo = (Bitmap) extras.get("data"); 
     LinearLayout layout = (LinearLayout) findViewById(R.id.rootLayout); 
     layout.addView(UIHelper.getImageViewFromPath(photo, getApplicationContext())); 
    } 
} 

Мне все еще нужно сохранить растровое изображение.

1

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

@Override 
public void onClick(View v) { 
if((ContextCompat.checkSelfPermission(MainActivity.this,         
      Manifest.permission.READ_EXTERNAL_STORAGE)!=PackageManager.PERMISSION_GRANTED)  
       || (ContextCompat.checkSelfPermission(MainActivity.this, 
       Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)) 

     { 
      ActivityCompat.requestPermissions 
        (MainActivity.this, new String[]{ 
          Manifest.permission.READ_EXTERNAL_STORAGE, 
          Manifest.permission.WRITE_EXTERNAL_STORAGE 
        },MY_PERMISSIONS_REQUEST_READ_AND_WRITE_EXTERNAL_STORAGE); 
     } 
} 
Смежные вопросы