Не могу создать файл на SD-карте

Я пытаюсь сохранить растровое изображение в файл, а затем сохранить его на SD-карте. Вот мой код:

String path = Environment.getExternalStorageDirectory().toString();
File file = new File(path, "Jhs"+".jpg");
file.mkdir();
OutputStream fOut;
try {
    fOut = new FileOutputStream(file);
    BitmapMatrix convMatrix = new BitmapMatrix(0);
    convMatrix.result.compress(Bitmap.CompressFormat.JPEG, 100, fOut);

    fOut.flush();
    fOut.close();
} catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

Также этот код находится в классе, который не расширяет Activity. Я просто даю эту информацию, думая, что, возможно, с этим есть какая-то проблема. Вот мой ЛогКэт

05-01 18:00:22.555: W/System.err(31392): java.io.FileNotFoundException:           /mnt/sdcard/Jhs.jpg (Permission denied)
05-01 18:00:22.555: W/System.err(31392):    at org.apache.harmony.luni.platform.OSFileSystem.open(Native Method)
05-01 18:00:22.555: W/System.err(31392):    at dalvik.system.BlockGuard$WrappedFileSystem.open(BlockGuard.java:232)
05-01 18:00:22.555: W/System.err(31392):    at java.io.FileOutputStream.<init>(FileOutputStream.java:94)
05-01 18:00:22.555: W/System.err(31392):    at java.io.FileOutputStream.<init>(FileOutputStream.java:66)
05-01 18:00:22.555: W/System.err(31392):    at com.example.imageprocess.BitmapMatrix.computeConvolution3x3(BitmapMatrix.java:123)
05-01 18:00:22.555: W/System.err(31392):    at com.example.imageprocess.MainActivity.sharpen(MainActivity.java:105)
05-01 18:00:22.555: W/System.err(31392):    at com.example.imageprocess.MainActivity.onCreate(MainActivity.java:51)
05-01 18:00:22.555: W/System.err(31392):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1072)
05-01 18:00:22.555: W/System.err(31392):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1836)
05-01 18:00:22.555: W/System.err(31392):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1893)
05-01 18:00:22.555: W/System.err(31392):    at android.app.ActivityThread.access$1500(ActivityThread.java:135)
05-01 18:00:22.555: W/System.err(31392):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1054)
05-01 18:00:22.555: W/System.err(31392):    at android.os.Handler.dispatchMessage(Handler.java:99)
05-01 18:00:22.565: W/System.err(31392):    at android.os.Looper.loop(Looper.java:150)
05-01 18:00:22.565: W/System.err(31392):    at android.app.ActivityThread.main(ActivityThread.java:4389)
05-01 18:00:22.565: W/System.err(31392):    at java.lang.reflect.Method.invokeNative(Native Method)
05-01 18:00:22.565: W/System.err(31392):    at java.lang.reflect.Method.invoke(Method.java:507)
05-01 18:00:22.565: W/System.err(31392):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:849)
05-01 18:00:22.565: W/System.err(31392):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:607)
05-01 18:00:22.565: W/System.err(31392):    at dalvik.system.NativeStart.main(Native Method)

person Himanshu Verma    schedule 01.05.2013    source источник
comment
@ Том, нет особого смысла в редактировании формата старого вопроса, который был оставлен без значимого решения и, скорее всего, является дубликатом множества других - все, что вы в конечном итоге делаете, это перетаскиваете его в начало страницы, отвлекая от вопросов, которые заслуживают внимания .   -  person Chris Stratton    schedule 02.01.2015


Ответы (4)


Этот logcat говорит, что у вас нет разрешения на запись файла. Убедитесь, что вы объявили

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

в манифесте андроида.

Вы можете добавить это:

File dir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getPath()+ "/%YOUR_FOLDER%/");
if (!(dir.exists() && dir.isDirectory())) {
    dir.mkdirs();
}

над вашим текущим кодом, если вы хотите попробовать другую папку для файла и посмотреть, поможет ли это. Код создаст каталог /sdcard/Downloads/YOUR_FOLDER/, в котором вы сможете создать файл. См. здесь варианты расположения хранилища.

Затем вы можете сделать

File file = new File(dir, "Jhs"+".jpg");
file.createNewFile(); //CREATE THE FILE FIRST!
OutputStream fOut;
try {
    fOut = new FileOutputStream(file);
    ....
}

и т.д. как в вашем посте.

person rcbevans    schedule 01.05.2013
comment
Вы уверены, что место, в котором вы пытаетесь создать файл, существует в файловой системе? Я отредактировал свой ответ, включив код для проверки существования каталога, а если нет, создайте его. - person rcbevans; 02.05.2013
comment
Кроме того, попробуйте изменить String path = Environment.getExternalStorageDirectory().toString(); путь к строке = Environment.getExternalStorageDirectory().toString().getPath(); - person rcbevans; 02.05.2013
comment
Еще одна мысль: устройство, которое вы используете для получения logcat, не имеет SD-карты, установленной в качестве внешнего хранилища для ПК, не так ли? Это приведет к ошибкам разрешения. Как бы не смонтировать SD-карту. - person rcbevans; 02.05.2013

Учитывая исключение, которое вы получаете, вам нужно для вашего AndroidManifest.xml файла разрешение WRITE_EXTERNAL_STORAGE

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
person Blackbelt    schedule 01.05.2013

java.io.FileNotFoundException: /mnt/sdcard/Jhs.jpg (отказано в доступе)

Добавьте это разрешение в манифест

   <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
person Pragnani    schedule 01.05.2013
comment
Вы размещаете файл . поэтому удалите file.mkdir();, так как он создаст каталог и будет использовать file.createNewFile() - person Pragnani; 02.05.2013
comment
Я тоже пробовал это, но все равно показывает мне ту же ошибку. Я пытался создать новый каталог вместо файла. Но код совсем не работает. - person Himanshu Verma; 02.05.2013

 java.io.FileNotFoundException: /mnt/sdcard/Jhs.jpg (Permission denied)

Похоже, у вас нет разрешения WRITE_EXTERNAL_STORAGE.

Добавьте это в свой AndroidMAnifest.xml:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
person koral    schedule 01.05.2013