마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

Bitmap to file Error ( Log 첨부 ) 확인 부탁드립니다. . .

0 추천

로그의 851 번째 NullPointException 은 out.close()입니다.
현재 Bitmap은 들어온 상태구요. 메소드에서 에러납니다. ㅠ
 
public void SaveBitmapToFileCache(Bitmap bitmap, String strFilePath, String filename) {
 
File copyFile = new File(strFilePath+filename+".jpg");
 
OutputStream out = null;
        
try {
           
   copyFile.createNewFile();
   out = new FileOutputStream(copyFile);
           
   bitmap.compress(CompressFormat.JPEG, 100, out);
           
   } catch (Exception e) {         
   e.printStackTrace();
   } finally {
        try {
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
   }
}
---------------------------------------------------------------------------
본문 , ( 모든 권한 추가함)
 
System.out.println("photo : " + photo);
filename = "crop";
String ex_storage = Environment.getExternalStorageDirectory().getAbsolutePath();
strFilePath =  ex_storage;
SaveBitmapToFileCache(photo, strFilePath , filename);

--------------------------------------------------------------------------

Log

 

 photo : android.graphics.Bitmap@4432e7a0
 java.io.IOException: open failed: EACCES (Permission denied)
  at java.io.File.createNewFile(File.java:946)
 
 Caused by: libcore.io.ErrnoException: open failed: EACCES (Permission denied)
  at libcore.io.Posix.open(Native Method)
  at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110)
  at java.io.File.createNewFile(File.java:939)
  ... 15 more
 
Caused by: java.lang.NullPointerException
 
adasd (220 포인트) 님이 2015년 8월 12일 질문
adasd님이 2015년 8월 12일 수정
<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" />
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.VIBRATE"/>

2개의 답변

+1 추천
 
채택된 답변

createNewFile에서 IOException이 발생하여,

 out = new FileOutputStream(copyFile);를 수행 하지 않다보니

out null 이 되어 Exception이 발생한 듯 합니다.

 

uses-permission (WRITE_EXTERNAL_STORAGE)이 있는 것으로 보아서는 sd카드 쪽은 저장이 될 텐데..

저장 경로가 /sdcard 쪽이 아닌 곳이거나 없는 디렉토리에서 파일을 생성하다 오류가 난  것으로 보입니다. 

익명사용자 님이 2015년 8월 12일 답변
adasd님이 2015년 8월 12일 채택됨
file : /storage/emulated/0/crop.jpg
경로로 저장되는데 문제가 될까요?
root 에 저장되는 건데
/storage/emulated/0/ 경로가 보통 sdcard 경로라 문제는 안 될듯은 한데..

제대로 해도 안됐다면,
단말에 따라 USB로 연결하여 PC에 sdcard가  마운팅 되면 sdcard가 접근이 안될 수 있는데 그경우가 아닐까 합니다.
adb shell로 들어가 ls -l 명령어로  /storage/emulated/0/  접근 권한을 확인 해보세요.
+1 추천
퍼미션 문제내요.

strFilePath+filename <== 내용 확인해보세요.

저기 말하는 퍼미션이 문제가 아니고 파일이 만들어 지는 위치자체가 잘못된 것 같은데요.

확인을 필해 해보시길.

strFilePath + "/" +filename 가 아닐까요?
컴러기 (22,230 포인트) 님이 2015년 8월 12일 답변
Unable to decode stream: java.io.FileNotFoundException: /storage/emulated/0: open failed: EISDIR (Is a directory)
 Async task execute error.
 java.lang.NullPointerException
     at
파일이 않만들어졌다는데요 훔...
strFilePath 가 "/storage/emulated/0" 인거죠?
중간에 "/" 넣어주셨을 때 위에러로 나온다는 거죠?
기기마다 Environment.getExternalStorageDirectory().getAbsolutePath();
이 결과가 조금씩 다르게 나오긴해요..
아무튼 아래분들의 말처럼 해당 폴더에 시스템 퍼미션은 맞는지도 확인하셔야 할듯 하구요.
음 근데 저기 위에 메세지 보면 디렉토리라고 나오는데 ..
혹시
File copyFile = new File(strFilePath+"/"+filename+".jpg"); 로 정확히 바꿔주신거 맞으시죠?
근데 왜 디렉토리지?
public void SaveBitmapToFileCache(Bitmap bitmap, String strFilePath, String filename) {
       
        System.out.println("bitmap : " +bitmap);
        System.out.println("strFilePath : " + strFilePath);
        System.out.println("filename : " + filename);
       
        File file = new File(strFilePath);
 
        // If no folders
        if (!file.exists()) {
            file.mkdirs();
             Toast.makeText(this, "Success", Toast.LENGTH_SHORT).show();
        }
        
        fullPath = strFilePath + "/" + filename +".jpg";
        System.out.println("fullPath : " + fullPath);
        File fileCacheItem = new File(fullPath);
        OutputStream out = null;
 
        try {
            fileCacheItem.createNewFile();
            out = new FileOutputStream(fileCacheItem);
 
            bitmap.compress(CompressFormat.JPEG, 100, out);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
filesystem에 문제가 있는듯한데 ㅠ
08-12 13:35:50.388: I/System.out(14522): strFilePath : /storage/emulated/0samsiki

08-12 13:35:50.398: I/System.out(14522): fullPath : /storage/emulated/0samsiki/crop.jpg
이름... 0하고  samsiki 사이에 / 넣어지도록 strFilePath 만드실때
"/" 중간에 넣어주셔야죠..
String ex_storage = Environment.getExternalStorageDirectory().getAbsolutePath();
strFilePath =  ex_storage + "samsiki" 하신듯한데 ㅡ.ㅡ

strFilePath =  ex_storage + "/samsiki" 하셔야죠.
...