2016-08-01 4 views
1

Я работаю над небольшим проектом приложения, который вызывает camera.app, снимает фотографию и возвращает фотографию на экране. Я могу пройти все шаги, когда фотография является локальной переменной. Однако, когда я хочу, чтобы сохранить его в определенном пути и читать его с пути, Android всегда предупреждаетНе удается получить доступ к каталогу sdcard в Android

'E/BitmapFactory: Unable to decode stream: java.io.FileNotFoundException: /storage/emulated/0/camera_app/cam_image.jpg: open failed: ENOENT (No such file or directory)' 

Там также предупреждения, что я не понимаю, такие как

E/linker: readlink('/proc/self/fd/42') failed: Permission denied [fd=42] 


E/HiApp.SerializedObject: Thread-840{840} a.b(null:-1) <<<ERROR>>> read file error/storage/emulated/0/Android/data/com.huawei.appmarket/files/Data/.AppCheckInfo: open failed: ENOENT (No such file or directory) 

The компьютер может прочитать SD-карту. Я не знаю, как отладить код

Button button; 
ImageView imageView; 
static final int CAM_REQUEST = 1; 
String SDPath = Environment.getExternalStorageDirectory().getAbsolutePath(); 
    TextView SDCard; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    button = (Button) findViewById(R.id.bn); 
    imageView = (ImageView) findViewById(R.id.img); 
    SDCard = (TextView)findViewById(R.id.sdcard); 
    SDCard.setText(SDPath); 
    button.setOnClickListener(new View.OnClickListener(){ 
     public void onClick(View v){ 
      Intent camera_intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
      File file = getFile(); 
      Uri contentUri = Uri.fromFile(file); 
      camera_intent.putExtra(MediaStore.EXTRA_OUTPUT,contentUri); 
      startActivityForResult(camera_intent,CAM_REQUEST); 

     }}); 
} 

private File getFile(){ 
    File folder = new File(SDPath+"/camera_app");//"EVA-AL10/sdcard/camera_app" "storage/1599-2841/camera_app" 
    if(!folder.exists()){ 
     folder.mkdir(); 
    } 
    File image_file = new File(folder,"cam_image.jpg"); 
    return image_file; 
} 

protected void onActivityResult(int requestCode, int resultCode, Intent data){ 
    String path = SDPath+"/camera_app/cam_image.jpg";//"EVA-AL10/sdcard/camera_app/cam_image.jpg" 
    imageView.setImageDrawable(Drawable.createFromPath(path)); 
} 

Изменено XML:

<uses-feature android:name="android.hardware.camera2" 
android:required="true"></uses-feature> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission> 
+1

Если вы настроите таргетинг на SDK 23+, убедитесь, что у вас есть разрешение на выполнение во время выполнения. –

+0

, на какой версии Android вы тестируете свое приложение? – UserSharma

+0

Работает на API 23 –

ответ

0

Я думаю, вам не хватает разрешения: READ_EXTERNAL_STORAGE

+0

Спасибо! Я добавил разрешение, но приложение все еще не работает. Похоже, что не удается найти путь к SD-карте, который я установил. –

0

Проверьте свой файл манифеста.

Вам нужно добавить эти два разрешения

READ_EXTERNAL_STORAGE

WRITE_EXTERNAL_STORAGE

0

Если вы ориентируетесь апи 23+, то вы должны добавить проверку разрешений во время выполнения программы. В вашем первом пусковом деятельности вам необходимо добавить этот код

@Override 
protected void onResume() { 
    super.onResume(); 
    if (Build.VERSION.SDK_INT >= 23){ 
     checkAllPermissions(); 
    } 
} 

здесь является метод проверки все разрешения

private void checkAllPermissions() { 
    if (ContextCompat.checkSelfPermission(mActivity, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { 
     ActivityCompat.requestPermissions(mActivity, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 
       MY_PERMISSIONS_REQUEST_STORAGE); 
     Log.d(TAG, "checkAllPermissions: inside write external"); 
    } 
    if (ContextCompat.checkSelfPermission(mActivity, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { 
     ActivityCompat.requestPermissions(mActivity, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 
       MY_PERMISSIONS_REQUEST_STORAGE); 
     Log.d(TAG, "checkAllPermissions: inside read external"); 
    }} 

надеюсь, что это поможет.

+0

Спасибо! mActivity, MY_PERMISSIONS_REQUEST_STORAGE и TAG не могут быть разрешены. Все ли они? –

+0

нет его константы private int MY_PERMISSIONS_REQUEST_STORAGE = 1; – UserSharma

+0

mActivity - это строка? Или класс? –

Смежные вопросы