android - 无法保存文本文件

Posted

技术标签:

【中文标题】android - 无法保存文本文件【英文标题】:android - can't save text file 【发布时间】:2016-10-12 14:02:28 【问题描述】:

这个问题很常见,我已经用谷歌搜索过了,但它仍然不起作用。我只是尝试使用以下代码保存文本文件:

                String state = Environment.getExternalStorageState();
                if (!Environment.MEDIA_MOUNTED.equals(state)) 
                    Toast.makeText(getApplicationContext(), "Access denied", Toast.LENGTH_LONG).show();
                
                String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/data";
                File dir = new File(path);
                dir.mkdirs();
                File file = new File(path + "/savedFile.txt");
                String saveText = new SimpleDateFormat("yyyyMMdd_HHmmss").format(Calendar.getInstance().getTime());
                FileOutputStream fos = null;
                try 
                    fos = new FileOutputStream(file);
                 catch (FileNotFoundException e) 
                    e.printStackTrace();
                
                try 
                    try 
                        fos.write(saveText.getBytes());
                     catch (IOException e) 
                        e.printStackTrace();
                    
                 finally 
                    try 
                        fos.close();
                     catch (IOException e) 
                        e.printStackTrace();
                    
                
                Toast.makeText(getApplicationContext(), "Saved", Toast.LENGTH_LONG).show();
                break;

在我的清单中我已经声明:

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

但是,每次我尝试运行代码时,应用程序都会崩溃并显示错误“不幸的是,APP_NAME 已停止。”谁能告诉我我的代码有什么问题?

【问题讨论】:

您是在 Marshmallow 或更高版本的设备上运行它吗? 另外请发布完整的堆栈跟踪。 调试的时候,到底是在哪一部分崩溃了? 是的,这是 android 6.0.1 Marshmellow。 6.0 有什么变化吗? 您需要运行时权限。 developer.android.com/training/permissions/requesting.html 【参考方案1】:
if ((checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE)   == PackageManager.PERMISSION_GRANTED)&& Build.VERSION.SDK_INT >= 23 ) 
                Log.v(TAG,"Permission is granted");
                return true;
              else
              ActivityCompat.requestPermissions(this, new String[]Manifest.permission.WRITE_EXTERNAL_STORAGE, REQUEST_CODE);
                  
    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) 
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if(grantResults[0]== PackageManager.PERMISSION_GRANTED)
            Log.v(TAG,"Permission: "+permissions[0]+ "was "+grantResults[0]);
             String state = Environment.getExternalStorageState();
            if (!Environment.MEDIA_MOUNTED.equals(state)) 
                Toast.makeText(getApplicationContext(), "Access denied", Toast.LENGTH_LONG).show();
            
            String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/data";
            File dir = new File(path);
            dir.mkdirs();
             File file = new File(path + "/savedFile.txt");
            String saveText = new SimpleDateFormat("yyyyMMdd_HHmmss").format(Calendar.getInstance().getTime());

                 try 
                       fos = new FileOutputStream(file);
                       OutputStreamWriter ow =  new OutputStreamWriter(fos);
                       ow.write(saveText.getBytes());
                       ow.append(saveText.getText());
                       ow.close();
                       fos.close();
                       Toast.makeText(getBaseContext(),
                       "Done writing SD 'mysdfile.txt'",Toast.LENGTH_SHORT).show();
                      catch (Exception e) 
                            Toast.makeText(getBaseContext(), e.getMessage(),Toast.LENGTH_SHORT).show();
                                           

        
    

您需要使用类似此代码的内容。因为您需要指定运行时权限。Marshmallow 需要您先检查权限才能使用相应的资源。 从 Android 6.0(API 级别 23)开始,用户在应用运行时授予应用权限,而不是在安装应用时。这种方法简化了应用程序安装过程,因为用户在安装或更新应用程序时不需要授予权限。它还使用户可以更好地控制应用程序的功能;例如,用户可以选择让相机应用程序访问相机而不是设备位置。用户可以通过进入应用程序的设置屏幕随时撤销权限

【讨论】:

以上是关于android - 无法保存文本文件的主要内容,如果未能解决你的问题,请参考以下文章

将文本文件保存到 Android 中的公共内部存储器位置

无法保存映射到文本文件的两个列表 - python

excel保存为制表符分隔的文本文件 js无法完整读取

Android 使用 Intent 保存和写入文本文件,得到 IOException “No content provider”

无法在 Linux 上使用 C++ 保存文本文件

在 Android 上下载文本文件 [重复]