我想将图像保存到SD卡中。但是只有在sd卡中创建命名图像文件的文件夹,但实际文件没有在SD卡中创建。我在尝试时遇到空指针异常将该图像保存到SD卡。这是代码:
public class MainActivity extends Activity {
ImageView bmImage;
LinearLayout view1;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
view1 = (LinearLayout)findViewById(R.id.certlinear);
bmImage = (ImageView)findViewById(R.id.certimage);
Button button =(Button)findViewById(R.id.btn);
button.setOnClickListener(hello);
}
Button.OnClickListener hello= new Button.OnClickListener()
{
@Override
public void onClick(View v)
{
View view = view1.getRootView();
//u can use any view of your View instead of TextView
if(view!=null)
{
System.out.println("view is not null.....");
view.setDrawingCacheEnabled(true);
view.buildDrawingCache();
Bitmap bm = view.getDrawingCache();
try
{
if(bm!=null)
{
System.out.println("bm is not null.....");
OutputStream fos = null;
File folder = new File(Environment.getExternalStorageDirectory().toString() + "/sample.JPEG");
boolean success = false;
if (!folder.exists()) {
success = folder.mkdirs();
}
if (!success) {
// Do something on success
} else {
// Do something else on failure
}
Toast.makeText(MainActivity.this,"path of the folder is "+folder.getAbsolutePath(), Toast.LENGTH_SHORT).show();
fos = new FileOutputStream(folder);
BufferedOutputStream bos = new BufferedOutputStream(fos);
bm.compress(Bitmap.CompressFormat.JPEG, 50, bos);
bos.flush();
bos.close();
view.setDrawingCacheEnabled(false);
}
}
catch(Exception e)
{
System.out.println("Error="+e);
e.printStackTrace();
}
}
}
};
}
这是例外日志:
09-13 18:44:18.957: W/System.err(3612): java.io.FileNotFoundException: /sdcard/sample.JPEG
09-13 18:44:18.967: W/System.err(3612): at org.apache.harmony.luni.platform.OSFileSystem.open(OSFileSystem.java:244)
09-13 18:44:18.967: W/System.err(3612): at java.io.FileOutputStream.<init>(FileOutputStream.java:97)
09-13 18:44:18.967: W/System.err(3612): at java.io.FileOutputStream.<init>(FileOutputStream.java:69)
09-13 18:44:18.976: W/System.err(3612): at com.example.mytest.MainActivity$1.onClick(MainActivity.java:96)
09-13 18:44:18.976: W/System.err(3612): at android.view.View.performClick(View.java:2364)
09-13 18:44:18.976: W/System.err(3612): at android.view.View.onTouchEvent(View.java:4179)
09-13 18:44:18.976: W/System.err(3612): at android.widget.TextView.onTouchEvent(TextView.java:6541)
09-13 18:44:18.976: W/System.err(3612): at android.view.View.dispatchTouchEvent(View.java:3709)
09-13 18:44:18.976: W/System.err(3612): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
09-13 18:44:18.987: W/System.err(3612): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
09-13 18:44:18.987: W/System.err(3612): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
09-13 18:44:18.987: W/System.err(3612): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
09-13 18:44:18.997: W/System.err(3612): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1659)
09-13 18:44:18.997: W/System.err(3612): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107)
09-13 18:44:18.997: W/System.err(3612): at android.app.Activity.dispatchTouchEvent(Activity.java:2061)
09-13 18:44:18.997: W/System.err(3612): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1643)
09-13 18:44:18.997: W/System.err(3612): at android.view.ViewRoot.handleMessage(ViewRoot.java:1691)
09-13 18:44:18.997: W/System.err(3612): at android.os.Handler.dispatchMessage(Handler.java:99)
09-13 18:44:18.997: W/System.err(3612): at android.os.Looper.loop(Looper.java:123)
09-13 18:44:18.997: W/System.err(3612): at android.app.ActivityThread.main(ActivityThread.java:4363)
09-13 18:44:19.011: W/System.err(3612): at java.lang.reflect.Method.invokeNative(Native Method)
09-13 18:44:19.011: W/System.err(3612): at java.lang.reflect.Method.invoke(Method.java:521)
09-13 18:44:19.011: W/System.err(3612): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
09-13 18:44:19.011: W/System.err(3612): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
09-13 18:44:19.011: W/System.err(3612): at dalvik.system.NativeStart.main(Native Method)
我在这行中得到空指针异常:
fos = new FileOutputStream(folder);
提前致谢。
答案 0 :(得分:3)
您是否添加了此权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
答案 1 :(得分:3)
你打电话
success = folder.mkdirs();
这会产生一个名为/ sdcard(存在)的文件夹和一个文件夹名称/sdcard/sample.JPEG您要写入图像的路径是一个目录。您无法在目录上打开OutputStream。
答案 2 :(得分:1)
只需在代码中进行简单的更改需求,请尝试以下操作,
File folder = new File(Environment.getExternalStorageDirectory().toString());
boolean success = false;
if (!folder.exists()) {
success = folder.mkdirs();
}
File file = new File(Environment.getExternalStorageDirectory().toString() + "/sample.JPEG");
if (!file.exists()) {
success = file.createNewFile();
}
答案 3 :(得分:0)
这在我的项目中很有用:
private void saveChicaDress(Bitmap dress){
String path = Environment.getExternalStorageDirectory().toString() +
getResources().getString(R.string.path_to_store);
OutputStream fOut = null;
File file = new File(path, "chica.png");
int i = 1;
while(file.exists()){
file = new File(path, "chica("+String.valueOf(i)+").png");
++i;
}
file.getParentFile().mkdirs();
try {
fOut = new FileOutputStream(file);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
dress.compress(Bitmap.CompressFormat.PNG, 100, fOut);
try {
fOut.flush();
fOut.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
并在AndroidManifest中:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>