2017-01-04 8 views
1

Я пытаюсь создать приложение, которое обнаруживает движение и снимает изображение при обнаружении движения. Его сохранение изображения, когда я не пытаюсь сохранить его в каталоге (папке). Но когда я пытаюсь использовать его в каталоге, изображение не сохраняется, даже если каталог создается успешно. Какие изменения нужно внести в следующий код, чтобы сделать его работу:Изображения не сохраняются в приложении моей камеры

private void createDirectoryAndSaveFile(String name, Bitmap bitmap) { 

     File folder = new File(Environment.getExternalStorageDirectory() + 
      File.separator + "XYX APP"); 
      boolean success = true; 
    if (!folder.exists()) { 
     success = folder.mkdirs(); 
    } 
     if (success) { 
     // Do something on success 

    } else { 
     // Do something else on failure 
    } 

     File photo = new File(new File(Environment.getExternalStorageDirectory()+"XYZ APP/"), name+ ".jpg"); 
     if (photo.exists()) { 
      photo.delete(); 
     } 
     try { 
      FileOutputStream out = new FileOutputStream(photo.getPath()); 
      bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out); 
      out.flush(); 
      out.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

Примечание: Имя файла генерируется в следующей инструкции:

String name = "MotDet_"+String.valueOf(System.currentTimeMillis()); 
      if (bitmap != null) createDirectoryAndSaveFile(name, bitmap); 

Update It работает со следующим кодом, но не с указанным выше кодом:

private void save(String name, Bitmap bitmap) { 
     File photo = new File(Environment.getExternalStorageDirectory(), name + ".jpg"); 
     if (photo.exists()) photo.delete(); 

     try { 
      FileOutputStream fos = new FileOutputStream(photo.getPath()); 
      bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos); 
      fos.close(); 
     } catch (java.io.IOException e) { 
      Log.e("PictureDemo", "Exception in photoCallback", e); 
     } 
    } 
+0

Вы тестируете в маршмелло? – Jayanth

+0

@Jayanth Да на s7 edge –

+0

@Jayanth Вы видели мой обновленный вопрос? Он работает с этим кодом, но не при попытке сделать каталог –

ответ

1

Прежде всего вы пропустили FileSeperator до того АБВ

File photo = new File(folder.getAbsolutePath()+"/XYZ APP/"+ name+ ".jpg"); 

И ваша функция становится

private void createDirectoryAndSaveFile(String name, Bitmap bitmap) { 

File folder = new File(Environment.getExternalStorageDirectory() + 
     File.separator + "XYZ APP");//here you have created different name 
boolean success = true; 
if (!folder.exists()) { 
    success = folder.mkdirs(); 
} 
if (success) { 
    // Do something on success 

} else { 
    // Do something else on failure 
} 

File photo = new File(folder.getAbsolutePath(), name+ ".jpg"); 
if (photo.exists()) { 
    photo.delete(); 
} 
try { 
    FileOutputStream out = new FileOutputStream(photo.getPath()); 
    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out); 
    out.flush(); 
    out.close(); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

}

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

public boolean isStoragePermissionGranted() { 
if (Build.VERSION.SDK_INT >= 23) { 
    if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) 
      == PackageManager.PERMISSION_GRANTED) { 
     Log.v(TAG,"Permission is granted"); 
     return true; 
    } else { 

     Log.v(TAG,"Permission is revoked"); 
     ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1); 
     return false; 
    } 
} 
else { //permission is automatically granted on sdk<23 upon installation 
    Log.v(TAG,"Permission is granted"); 
    return true; 
} 

}

разрешение результат обратного вызова

@Override 
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
     super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
     if(grantResults[0]== PackageManager.PERMISSION_GRANTED){ 
      Log.v(TAG,"Permission: "+permissions[0]+ "was "+grantResults[0]); 
      //resume tasks needing this permission 
     } 
    } 

перед сохранением вызова isStoragePermissionsGranted() если она возвращает true действуйте сохранения файла.

+0

На самом деле я пытаюсь использовать API 22. Он сохраняет файл, когда я пытаюсь сделать это в корневой части SD-карты. но это не происходит, когда я пытаюсь в папке. –

+0

Вы пропустили File seperator '/' перед тем, как XYZ попробуете добавить его – Jayanth

+0

Я попытался добавить разделитель файлов. его все еще не спасает. :( –

0

Попробуйте этот код:

String partFilename = currentDateFormat(); 
storeCameraPhotoInSDCard(bp, partFilename); 

private String currentDateFormat(){ 
     SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd_HH_mm_ss"); 
     String currentTimeStamp = dateFormat.format(new Date()); 
     return currentTimeStamp; 
    } 

private void storeCameraPhotoInSDCard(Bitmap bitmap, String currentDate){ 
     File outputFile = new File(Environment.getExternalStorageDirectory(), "photo_" + currentDate + ".jpg"); 
     try { 
      FileOutputStream fileOutputStream = new FileOutputStream(outputFile); 
      bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fileOutputStream); 
      fileOutputStream.flush(); 
      fileOutputStream.close(); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

Этот код для работы me..Save изображения в каталоге.

+0

Я хочу сохранить файл внутри папки на SD-карте, а не в корне SD-карты –

+0

Вы видели этот вопрос на своем http: //stackoverflow.com/questions/41798795/how-to-create-a-layout-on-top-of-my-camera-surfaceview –

0

Вы должны получить permission внешнего хранения во время выполнения в android 6.0 и выше, чтобы написать в SDCard

Read Run time Permission

добавить в Manifest.xml

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

заменить вашу функция ниже 1

private void createDirectoryAndSaveFile(String name, Bitmap bitmap) { 

    File folder = new File(Environment.getExternalStorageDirectory() + 
      File.separator + "XYZ APP");//here you have created different name 
    boolean success = true; 
    if (!folder.exists()) { 
     success = folder.mkdirs(); 
    } 
    if (success) { 
     // Do something on success 

    } else { 
     // Do something else on failure 
    } 

    File photo = new File(folder.getAbsolutePath(), name+ ".jpg"); //use path of above created folder 
    if (photo.exists()) { 
     photo.delete(); 
    } 
    try { 
     FileOutputStream out = new FileOutputStream(photo.getPath()); 
     bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out); 
     out.flush(); 
     out.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
+0

Я сделал это. Он сохраняет файл, когда я пытаюсь сделать это в корне sd card, но это не происходит, когда я пытаюсь в папке –

+0

вы забыли разделителя здесь. «Environment.getExternalStorageDirectory() +« XYZ APP/»), имя +« .jpg »)' –

+0

Я попытался добавить файл разделитель. его все еще не спасает. :( –

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

  • Нет связанных вопросов^_^