尝试在android中写入SD卡的空指针异常

时间:2015-09-05 21:34:52

标签: java android

这是我在我的应用

的启动活动中的onCreate()方法中的代码
 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_startup);


    Bitmap bm = BitmapFactory.decodeResource(getApplicationContext().getResources(), R.drawable.img);
    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    bm.compress(Bitmap.CompressFormat.PNG, 40, bytes);

//you can create a new file name "test.jpg" in sdcard folder.
    File f = new File(Environment.getExternalStorageDirectory()
            + File.separator + "test.jpg");
    try {
        f.createNewFile();
    } catch (IOException e) {
        e.printStackTrace();
    }
//write the bytes in file
    FileOutputStream fo = null;
    try {
        fo = new FileOutputStream(f);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    try {
        fo.write(bytes.toByteArray());
    } catch (IOException e) {
        e.printStackTrace();
    }
    try {
        fo.close();
    } catch (IOException e) {
        e.printStackTrace();
    }

这意味着将图像加载到位图中,然后在名为" test.jpg"的SD卡上创建一个文件。内部的图像,但这不是正在发生的事情。

相反,我在行

上得到一个空指针异常
 fo.write(bytes.toByteArray());

错误消息是:

 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.daniel.firstapp/com.example.daniel.firstapp.startup}: java.lang.NullPointerException: Attempt to invoke virtual method 'void java.io.FileOutputStream.write(byte[])' on a null object reference

3 个答案:

答案 0 :(得分:0)

第一:为什么这么多try/catch

第二:您的fo变量为null

可能是因为无法创建文件。

确保你的清单中有这个:

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

答案 1 :(得分:0)

您可以删除ByteArrayOutputStream并将其替换为FileOutputStream

注意:为清楚起见,省略了try / catch块。

File f = new File(Environment.getExternalStorageDirectory() + File.separator + "test.jpg");
// 'this' in the following line refers to an instance of your Activity, if you're doing your output from a fragment or helper class, get a reference to your activity.
FileOutputStream fos = this.openFileOutput(f.getName(), Context.MODE_PRIVATE);
Bitmap bm = BitmapFactory.decodeResource(getApplicationContext().getResources(), R.drawable.img);
//PNG doesn't compress because it's lossless
bm.compress(Bitmap.CompressFormat.PNG, 100, fos);

fos.flush();
fos.close();
bm.recycle();

还要确保您在清单中设置了相应的写入外部存储权限。

答案 2 :(得分:0)

从android 4.4开始,正常的应用程序不允许访问辅助外部存储设备,即SD卡,除非在特定于程序包的目录中,即使您已请求WRITE_EXTERNAL_STORAGE权限。

  

WRITE_EXTERNAL_STORAGE权限只能授予对其的写访问权限   设备上的主要外部存储。不得允许应用   写入辅助外部存储设备,除了它们   特定于程序包的目录,由合成权限允许。   以这种方式限制写入可确保系统可以清理文件   何时卸载应用程序。

https://source.android.com/devices/storage/

实际上,由于限制,您的应用程序在下面的行中抛出了异常。

FileOutputStream fo = null;
try {
    fo = new FileOutputStream(f);
} catch (FileNotFoundException e) {
    e.printStackTrace();
}