【问题标题】:Unable to read files from internal storage in android application?无法从 Android 应用程序的内部存储中读取文件?
【发布时间】:2013-12-27 07:03:24
【问题描述】:

我是 android 新手。我创建了一个应用程序来创建和读取内部和外部存储中的文本文件。文本文件创建在外部和内部存储中成功完成。从外部存储读取文件也可以,但在从内部存储读取文件时遇到问题并出现错误“获取文件内容时发生错误:FileName.txt”

请看下面的代码:

//MainActivity.java

public class MainActivity extends Activity implements OnClickListener {

private String filename = "StorageFile.txt";
private String filepath = "FileStorage";
File myInternalFile;
File myExternalFile;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ContextWrapper contextWrapper = new ContextWrapper(
            getApplicationContext());
File directory = contextWrapper.getDir(filepath, Context. MODE_WORLD_WRITEABLE);
    myInternalFile = new File(directory, filename);

Button saveToInternalStorage = (Button) findViewById(R.id.InternalStorageSave);
    saveToInternalStorage.setOnClickListener(this);

Button readFromInternalStorage = (Button) findViewById(R.id.InternalStorageGet);
    readFromInternalStorage.setOnClickListener(this);

Button saveToExternalStorage = (Button) findViewById(R.id.ExternalStorageSave);
    saveToExternalStorage.setOnClickListener(this);

Button readFromExternalStorage = (Button) findViewById(R.id.ExternalStorageGet);
    readFromExternalStorage.setOnClickListener(this);

    // check if external storage is available and not read only
    if (!isExternalStorageAvailable() || isExternalStorageReadOnly()) {
        saveToExternalStorage.setEnabled(false);
    } else {
        myExternalFile = new File(getExternalFilesDir(filepath), filename);
    }

}

public void onClick(View v) {

    EditText myInputText = (EditText) findViewById(R.id.InputText);
    TextView responseText = (TextView) findViewById(R.id.responseText);
    String myData = "";

    switch (v.getId()) {
    case R.id.InternalStorageSave:
        try {
            FileOutputStream fos = openFileOutput(filename,
                    Context.MODE_PRIVATE);
            fos.write(myInputText.getText().toString().getBytes());
            fos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        myInputText.setText("");
    responseText.setText("Saved to Internal Storage.(StorageFile.txt)");
        break;

    case R.id.InternalStorageGet:
        try {
            FileInputStream fis = openFileInput(filename);
            DataInputStream in = new DataInputStream(fis);
            BufferedReader br = new BufferedReader(
                    new InputStreamReader(in));
            String strLine;
            while ((strLine = br.readLine()) != null) {
                myData = myData + strLine;
            }
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        myInputText.setText(myData);
        responseText
        .setText("Data retrieved from Internal Storage.(StorageFile.txt)");
        openFile(myInternalFile);

        break;

    case R.id.ExternalStorageSave:
    try {
        FileOutputStream fos = new FileOutputStream(myExternalFile);
            fos.write(myInputText.getText().toString().getBytes());
            fos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        myInputText.setText("");
    responseText.setText("Saved to External Storage.(StorageFile.txt)");
        break;

    case R.id.ExternalStorageGet:
        try {
            FileInputStream fis = new FileInputStream(myExternalFile);
            DataInputStream in = new DataInputStream(fis);
            BufferedReader br = new BufferedReader(
                    new InputStreamReader(in));
            String strLine;
            while ((strLine = br.readLine()) != null) {
                myData = myData + strLine;
            }
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        myInputText.setText(myData);
        responseText
        .setText("Data retrieved from Internal Storage.(StorageFile.txt)");
        openFile(myExternalFile);
        break;

    }
}

private void openFile(File file) {
    final Intent intent = new Intent();
    intent.setAction(android.content.Intent.ACTION_VIEW);
    final MimeTypeMap mime = MimeTypeMap.getSingleton();
    final String ext = file.getName().substring(
            file.getName().indexOf(".") + 1);
    final String type = mime.getMimeTypeFromExtension(ext);
    intent.setDataAndType(Uri.fromFile(file), type);
    startActivity(intent);
}

private static boolean isExternalStorageReadOnly() {
    String extStorageState = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(extStorageState)) {
        return true;
    }
    return false;
}

private static boolean isExternalStorageAvailable() {
    String extStorageState = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(extStorageState)) {
        return true;
    }
    return false;
}

//activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

<TextView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="Storage Demo" />

<EditText
    android:id="@+id/InputText"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:ems="10"
    android:gravity="top|left"
    android:inputType="textMultiLine"
    android:lines="5"
    android:minLines="2"
    android:text="Internal and External Storage" >

    <requestFocus />
</EditText>

<Button
    android:id="@+id/InternalStorageSave"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Internal Storage(Save)" />

<Button
    android:id="@+id/InternalStorageGet"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Internal Storage(Display)" />

<Button
    android:id="@+id/ExternalStorageSave"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="External Storage(Save)" />

<Button
    android:id="@+id/ExternalStorageGet"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="External Storage(Displays)" />

<TextView 
    android:id="@+id/responseText"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:padding="5dp"
    android:text=""
    android:textAppearance="?android:attr/textAppearanceMedium" />

</LinearLayout>

我还添加了以下权限来读取和写入文件到外部存储

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

定位输出:

12-27 02:20:22.795: E/StrictMode(944): file:// Uri exposed through Intent.getData()
12-27 02:20:22.795: E/StrictMode(944): java.lang.Throwable: 
file:// Uri exposed through Intent.getData()
12-27 02:20:22.795: E/StrictMode(944): at     
android.os.StrictMode.onFileUriExposed(StrictMode.java:1597)
12-27 02:20:22.795: E/StrictMode(944):  at 
android.net.Uri.checkFileUriExposed(Uri.java:2338)
12-27 02:20:22.795: E/StrictMode(944):  at 
android.content.Intent.prepareToLeaveProcess(Intent.java:7194)
12-27 02:20:22.795: E/StrictMode(944):  at   
android.app.Instrumentation.execStartActivity(Instrumentation.java:1418)
12-27 02:20:22.795: E/StrictMode(944):  at 
android.app.Activity.startActivityForResult(Activity.java:3423)
12-27 02:20:22.795: E/StrictMode(944): at  android.app.Activity.startActivityForResult
(Activity.java:3384)
12-27 02:20:22.795: E/StrictMode(944): at android.app.Activity.startActivity
(Activity.java:3626)
12-27 02:20:22.795: E/StrictMode(944):  
at android.app.Activity.startActivity(Activity.java:3594)
12-27 02:20:22.795: E/StrictMode(944): at  
com.android.internal.app.ResolverActivity.onIntentSelected(ResolverActivity.java:407)
12-27 02:20:22.795: E/StrictMode(944):  at  
com.android.internal.app.ResolverActivity.startSelected(ResolverActivity.java:299)
12-27 02:20:22.795: E/StrictMode(944):  at 
com.android.internal.app.ResolverActivity.onButtonClick(ResolverActivity.java:289)
12-27 02:20:22.795: E/StrictMode(944):  at 
java.lang.reflect.Method.invokeNative(Native Method)
12-27 02:20:22.795: E/StrictMode(944): at       
java.lang.reflect.Method.invoke(Method.java:515)
12-27 02:20:22.795: E/StrictMode(944): at android.view.View$1.onClick(View.java:3809)
12-27 02:20:22.795: E/StrictMode(944):at android.view.View.performClick(View.java:4424)
12-27 02:20:22.795: E/StrictMode(944):at 
android.view.View$PerformClick.run(View.java:18383)
 12-27 02:20:22.795: E/StrictMode(944): at android.os.Handler.handleCallback
 (Handler.java:733)
 12-27 02:20:22.795: E/StrictMode(944): at android.os.Handler.dispatchMessage
 (Handler.java:95)
 12-27 02:20:22.795: E/StrictMode(944): at android.os.Looper.loop(Looper.java:137)
 12-27 02:20:22.795: E/StrictMode(944): at android.app.ActivityThread.main
 (ActivityThread.java:4998)
 12-27 02:20:22.795: E/StrictMode(944): at java.lang.reflect.Method.invokeNative
 (Native  Method)
 12-27 02:20:22.795: E/StrictMode(944): at    
 java.lang.reflect.Method.invoke(Method.java:515)
 12-27 02:20:22.795: E/StrictMode(944): at
 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777)
 12-27 02:20:22.795: E/StrictMode(944): at    com.android.internal.os.ZygoteInit.main
 (ZygoteInit.java:593)
 12-27 02:20:22.795: E/StrictMode(944): at dalvik.system.NativeStart.main
 (Native Method)
 12-27 02:20:22.815: I/ActivityManager(371): START u0 
 {act=android.intent.action.VIEW dat=file:///data/data/com.example.external/
  app_FileStorage/StorageFile.txt typ=text/plain \
  flg=0x3000000 cmp=com.android.htmlviewer/.HTMLViewerActivity} from pid 944
 12-27 02:20:23.015: D/gralloc(49): Registering a buffer in the process that 
 created it.    This may cause memory ordering problems.
 12-27 02:20:23.015: E/libEGL(49): called unimplemented OpenGL ES API
 12-27 02:20:23.015: E/libEGL(49): called unimplemented OpenGL ES API
 12-27 02:20:23.015: E/libEGL(49): called unimplemented OpenGL ES API
 12-27 02:20:23.025: E/libEGL(49): called unimplemented OpenGL ES API
 12-27 02:20:23.025: E/SurfaceFlinger(49): glCheckFramebufferStatusOES error -480946759
 12-27 02:20:23.025: E/SurfaceFlinger(49): got GL_FRAMEBUFFER_COMPLETE_OES 
 error while  taking screenshot
 12-27 02:20:23.025: E/libEGL(49): called unimplemented OpenGL ES API
 12-27 02:20:23.025: E/libEGL(49): called unimplemented OpenGL ES API
 12-27 02:20:23.025: W/WindowManager(371): Screenshot failure taking 
 screenshot for (328x546) to layer 21015
 12-27 02:20:23.805: D/dalvikvm(1133): GC_FOR_ALLOC freed 49K, 2% free 
 6543K/6656K, paused 77ms, total 92ms
 12-27 02:20:24.545: W/AwContents(1133): nativeOnDraw failed; 
 clearing to background color.
 12-27 02:20:24.625: I/Choreographer(944): Skipped 153 frames!  
 The application may be doing    too much work on its main thread.
 12-27 02:20:25.795: W/AwContents(1133): nativeOnDraw failed; 
 clearing to background color.
 12-27 02:20:25.945: I/ActivityManager(371): Displayed   
 com.android.htmlviewer/.HTMLViewerActivity: +2s834ms
  12-27 02:20:25.945: I/Choreographer(371): Skipped 32 frames!  The application may 
   be     doing too much work on its main thread.
 12-27 02:20:26.165: E/AndroidProtocolHandler(1133): Unable to open content URL:      
   content: //com.android.htmlfileprovider/data/data/com.example.external/
 app_FileStorage/StorageFile.txt?text/plain

你能告诉我如何从内部存储中读取文件吗?

问候, 谢娜兹

【问题讨论】:

  • 请添加logcat输出
  • 内部存储、数据/数据目录或内部存储器(手机存储)是什么意思

标签: android


【解决方案1】:

试试这样的:

try {

    BufferedReader inputReader = new BufferedReader(new InputStreamReader(

            openFileInput("DayTwentyTwoFile")));

    String inputString;

    StringBuffer stringBuffer = new StringBuffer();                

    while ((inputString = inputReader.readLine()) != null) {

        stringBuffer.append(inputString + "\n");

    }

    lblTextViewOne.setText(stringBuffer.toString());

} catch (IOException e) {

    e.printStackTrace();

}

【讨论】:

  • 正在读取和设置标签上的文本。从记事本、文本编辑器等其他 android 应用程序读取文件不起作用。如何设置内部存储的权限?
  • @user3138623 另一个应用程序无法读取存储在您应用程序内部存储中的文件。为此,您必须将该文件复制到外部存储设备以使其全球可读。
  • @Ketan 大多数时候移动设备没有外部存储。那么如何解决这个问题。
  • 您必须检查它是否连接了存储卡。并根据结果生成 toast 或其他东西来确认用户外部存储不存在。
【解决方案2】:

我希望您能说一下特定于任何应用程序的数据\数据目录文件。因此,如果您想访问任何应用程序的数据\数据文件,则该应用程序应根据内容提供者和权限为其提供权限(如果有任何指定)。

如果它的内部存储那么你可以读取没有问题,用下面的 androidmanifest.xml 权限写入它。
&lt;uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"&gt;&lt;/uses-permission&gt;

【讨论】:

  • 我已经加了写权限,还是不行
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-13
  • 1970-01-01
  • 2013-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多