如何在Android Kitkat中访问外部SD卡中的(读/写)文件?

时间:2014-02-25 02:14:29

标签: android android-sdcard android-4.4-kitkat

这是我的源代码; 我在external_SD上安装了microsdsvc app。

szSDCardFileName = "/storage/external_SD/Android/data/com.tmnt.microsdsvc/files/AAA.DAT";

if ((fp = open(szSDCardFileName, O_RDWR|O_DIRECT|O_SYNC, S_IRWXU)) == -1) {
    if ((fp = open(szSDCardFileName, O_RDWR|O_DIRECT|O_SYNC|O_CREAT, S_IRWXU)) == -1) {
        return -1;
    }
}

memset(g_buf, 0x00, BLOCK_LENGTH);
if (read(fp, (char *)g_buf, BLOCK_LENGTH) == ERROR) {
    __android_log_print(ANDROID_LOG_INFO, "JNI", "<Err>file read error[errno=%d, handle=%d]", errno, fp);
    return -1;
}

在Lg G2 Kitkat版本上运行代码时,open()没问题,但是下一个read()失败,错误号为22。

我不知道我错了!

3 个答案:

答案 0 :(得分:2)

也许这就是为什么......

KitKat,应用程序将无法再分别在“辅助外部存储设备”上创建,修改或删除带有内置闪存和可移动/外置SD卡的双存储设备上的文件和文件夹。

“WRITE_EXTERNAL_STORAGE权限必须仅授予设备上主外部存储的写访问权限。不得允许应用程序写入辅助外部存储设备,但合成权限允许的特定于程序包的目录除外。” p>

http://source.android.com/devices/tech/storage/index.html

答案 1 :(得分:0)

package com.example.readfilefromexternalresource;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import android.app.Activity;
import android.app.ActionBar;
import android.app.Fragment;
import android.os.Bundle;
import android.os.Environment;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;
import android.os.Build;

public class MainActivity extends Activity {
    private TextView textView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    textView = (TextView)findViewById(R.id.textView);
    String state = Environment.getExternalStorageState();

    if (!(state.equals(Environment.MEDIA_MOUNTED))) {

        Toast.makeText(this, "There is no any sd card", Toast.LENGTH_LONG).show();


    } else {
        BufferedReader reader = null;
        try {
            Toast.makeText(this, "Sd card available", Toast.LENGTH_LONG).show();
            File file = Environment.getExternalStorageDirectory();
            File file2 = new File(file.getAbsolutePath()+File.separator + "myText.txt");
            reader = new BufferedReader(new FileReader(file2));
            StringBuilder textBuilder = new StringBuilder();
            String line;
            while((line = reader.readLine()) != null) {
                textBuilder.append(line);
                textBuilder.append("\n");

            }
            textView.setText(textBuilder);

        } catch (FileNotFoundException e) {
            // TODO: handle exception
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        finally{
            if(reader != null){
                try {
                    reader.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }

    }
}

}

答案 2 :(得分:-1)

  • 首先,你需要获得外部SD卡的状态
  • 然后你检查是否有一个已安装的SD卡,如果找不到SD卡,它将什么都不做(你可以在这里放错误消息)
  • 获取其绝对路径并添加分隔符,然后输入要读取的文件的文件名
  • 使用BufferedReader读取textFile。
  • 使用StringBuilder构建字符串,它比简单的连接字符串更有效
  • 附加你的字符串后,总是关闭阅读器以节省内存,已知智能手机的内存比桌面更少
  • 调用StringBuiler的toString()方法来创建你可以使用的String

    String state = Environment.getExternalStorageState();
    
    if(!state.equals(Environment.MEDIA_MOUNTED)) {
    } else {
        File externalDir = Environment.getExternalStorageDirectory();
        File textFile = new File(externalDir.getAbsolutePath() 
            + File.separator + fileName);
    
    BufferedReader reader 
            = new BufferedReader(new FileReader(textFile));
    StringBuilder textBuilder = new StringBuilder();
    String line;
    while((line = reader.readLine()) != null) {
        textBuilder.append(line);
        textBuilder.append("\n");
    }
    reader.close();
    String yourString = textBuilder.toString();
    }
    

它会抛出一个FileNotFound异常btw。你也可以写一个文件。