2017-02-10 13 views
1

В основном я пытаюсь создать простое приложение, которое использует приложение камеры по умолчанию, чтобы сделать снимок, затем я хочу отобразить это изображение в новом действии в ImageView , но все, что я пытался привелНевозможно отобразить результат работы камеры в ImageView

java.io.FileNotFoundException: /storage/emulated/0/imageToProcess.jpg: open failed: ENOENT (No such file or directory)

Я включил правильные разрешения (возможно, даже слишком много) в манифесте:

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

и я также вручную с просьбой разрешения, если необходимо, в в деятельности:

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
    if(checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { 
      requestPermissions(new String[]{Manifest.permission.CAMERA}, 1); 
    } 
    if(checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { 
     requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1); 
    } 
    if(checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { 
     requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1); 
    } 
} 

поэтому я не думаю, что проблема связана с разрешениями на чтение/запись.

В XML-файле моего основного вида деятельности, я создал кнопку с помощью прослушивателя OnClick, который вызывает следующий метод:

public void openCamera(View view) { 
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    File f = new File(Environment.getExternalStorageDirectory() + File.separator + "imageToProcess.jpg"); 
    imgUri = Uri.fromFile(f); 
    intent.putExtra("imgUri", imgUri.toString()); 
    startActivityForResult(intent, TAKE_PICTURE); 
} 

Вот метод onActivityResult() я определил, чтобы создать новое намерение и передать URI для новой деятельности:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent intent) { 
    super.onActivityResult(requestCode, resultCode, intent); 
    if(requestCode == TAKE_PICTURE && resultCode == Activity.RESULT_OK) { 
     Intent camResult = new Intent(this, ShowCameraResult.class); 
     camResult.putExtra("imgUri", imgUri.toString()); 
     startActivity(camResult); 
    } 
} 

Примечание: imgUri и TAKE_PICTURE определяются в верхней части класса, как protected static final int TAKE_PICTURE = 1; и private Uri imgUri;

Наконец, вот мой ShowCameraResult активность

public class ShowCameraResult extends AppCompatActivity { 
    private Bitmap mImageBitmap; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_show_camera_result); 
     ImageView imageView = (ImageView)findViewById(R.id.imageView); 
     String filePath = getIntent().getStringExtra("imgUri"); 
     Log.d("ShowCameraResult", "directory: " + filePath); 
     try { 
      mImageBitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), Uri.parse(filePath)); 
      imageView.setImageBitmap(mImageBitmap); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Метод вызова Log.d выше возвращает

ShowCameraResult: directory: file:///storage/emulated/0/imageToProcess.jpg 

Это приводит меня к мысли, что результат изображения с камеры на самом деле не сохраняются в мой imageToProcess.jpg, но я мог быть очень не прав, поскольку это первый настоящий проект андроида, над которым я работал.

Так что мой вопрос: Где я ошибся?

Любая помощь очень ценится, спасибо!

+0

испытание его на устройстве не на эмуляторе –

+0

@Dhara Я тестирование на Galaxy S5 – Austin

+0

Сво ошибка в тесте Samsung на другой device –

ответ

0

ITs, возвращающие файл, а не URL-адрес разрешения. Просто расшифруйте файл с помощью BitmapFactory.

+0

Возвращает URI файла. Используйте BitmapFactory.decodeFile, чтобы получить битмап для файла. Затем отобразите это. Нет необходимости в разрешении контента, он не возвращает UR. Его хранение файла прямо там, где вы его просили, в ваших намерениях. –

+0

О, и боковое примечание - вам не нужно разрешение камеры для запуска намерения камеры. Только если вы планируете сделать снимок в своем приложении. –

0
private void dispatchTakePictureIntent() { 
     Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
     if (takePictureIntent.resolveActivity(getPackageManager()) != null) { 
      startActivityForResult(takePictureIntent, TAKE_PICTURE); 
     } 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     Log.d(TAG, "onActivityResult: "+data); 
     if (requestCode == TAKE_PICTURE && resultCode == RESULT_OK) { 
      Bundle extras = data.getExtras(); 
      Bitmap imageBitmap = (Bitmap) extras.get("data"); 
      Log.d(TAG, "onActivityResult: "+imageBitmap); 
      imageView.setImageBitmap(imageBitmap); 
     } 
    } 

SenderActivity:

Intent _intent = new Intent(this, newscreen.class); 
Bitmap _bitmap; // your bitmap 
ByteArrayOutputStream _bs = new ByteArrayOutputStream(); 
_bitmap.compress(Bitmap.CompressFormat.PNG, 50, _bs); 
i.putExtra("byteArray", _bs.toByteArray()); 
startActivity(i); 

ReciverActivity

if(getIntent().hasExtra("byteArray")) { 
ImageView _imv= new ImageView(this); 
Bitmap _bitmap = BitmapFactory.decodeByteArray(
     getIntent().getByteArrayExtra("byteArray"),0,getIntent().getByteArrayExtra("byteArray").length);   
_imv.setImageBitmap(_bitmap); 
}