求问:哪里出错??已经取得写入权限了。代码如下:
package com.beak.android.diarybook;import java.text.SimpleDateFormat;
import java.util.Date;import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;import com.beak.android.diarybook.output.FileUtils;public class DiaryBookActivity extends Activity {
        EditText titleText = null;
        EditText contentText = null;
        TextView titleDate = null;
       
        FileUtils fu = new FileUtils();
       
        SimpleDateFormat YMD = new SimpleDateFormat("yyyy-MM-dd        EEE");
       
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        titleText = (EditText)findViewById(R.id.title);
        contentText = (EditText)findViewById(R.id.content);
        titleDate = (TextView)findViewById(R.id.titleDate);
        
        contentText.setLines(25);
        contentText.setTextSize(15);
        titleText.setText(R.string.secondtitle);
        titleText.setTextSize(1, 15);
        titleDate.setText(YMD.format(new Date()));
        
    }        public boolean onCreateOptionsMenu(Menu menu) {
                menu.add(0, 1, 1, R.string.write);
                menu.add(0, 2, 2, R.string.save);
                menu.add(0, 3, 3, R.string.open);
                menu.add(0, 4, 4, R.string.self);
                menu.add(0, 5, 5, R.string.exit);
                return super.onCreateOptionsMenu(menu);
        }        public boolean onOptionsItemSelected(MenuItem item) {
                switch (item.getItemId()) {
                case 1: Toast.makeText(DiaryBookActivity.this, R.string.writetoast, Toast.LENGTH_LONG).show();break;
                case 2: fu.write2SDcard(fu.getSDPATH(), titleDate.getText().toString(), contentText.getText().toString());
                                System.out.println("saved????");
                                Toast.makeText(DiaryBookActivity.this, R.string.savetoase, Toast.LENGTH_SHORT).show();break;
                case 3: Toast.makeText(DiaryBookActivity.this, R.string.opentoast, Toast.LENGTH_SHORT).show();break;
                case 4: System.out.println("self-control");Log.d("debug", "see it?");break;
                case 5: finish();
                }
                return super.onOptionsItemSelected(item);
        }
   
}通过输出System.out.println("saved???");发现,那句话应该执行了,但是在存储卡位置就是没有文件,应该是那句话有问题。这个是我改造别人写的类:
package com.beak.android.diarybook.output;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStream;import java.io.OutputStreamWriter;import android.os.Environment;public class FileUtils {        private String SDPATH;        public String getSDPATH() {                return SDPATH;        }        public FileUtils() {                SDPATH = Environment.getExternalStorageDirectory() + "/";        }        public File creatSDFile(String fileName) throws IOException {                File file = new File(SDPATH + fileName);                file.createNewFile();                return file;        }               public File creatSDDir(String dirName) {                File dir = new File(SDPATH + dirName);                dir.mkdirs();                return dir;        }        public boolean isFileExist(String fileName){                File file = new File(SDPATH + fileName);                return file.exists();        }        public File write2SDcard(String path,String fileName,String content){                File file = null;                OutputStream output = null;                try{                        creatSDDir(path);                        file = creatSDFile(path + fileName);                        output = new FileOutputStream(file);                        OutputStreamWriter osw = new OutputStreamWriter(output);                        osw.append(content);                                               osw.flush();                        osw.close();                }                catch(Exception e){                        e.printStackTrace();                }                finally{                        try{                                output.close();                        }                        catch(Exception e){                                e.printStackTrace();                        }                }                return file;        }}

解决方案 »

  1.   

    初步观察可能有的问题点为:
     1. fu.write2SDcard(fu.getSDPATH(), titleDate.getText().toString(), contentText.getText().toString());
        观察到内部实现方式,你应该会创建这样一个目录:/mnt/sdcard//mnt/sdcard。因为你拿到SD卡的路径,同时以此为相对路径,作为 creatSDDir() 方法的参数。同时可能有“两根斜线”的问题
     2. creatSDFile 实现方式最好为:
      
       public File creatSDFile (String filename) {     File dir = new File(SDPATH);     return new File(dir, filename);    }
      
     3. 最后记得将output 关闭:
       
        output.close();
       
      4. SD卡上创建文件的权限是否已申请才疏学浅,找不到明显错误。但是我相信,尽量将代码规范化,可以避免大部分的错误。