这是我在我的应用
的启动活动中的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
答案 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();
}