为什么我没有将文件保存到SD卡的权限?

Why I don't have the permission to save the file into SD Card?

我想用Android系统中的文件浏览器来显示我之前保存的文件。

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
            intent.setType(ContactsContract.Contacts.CONTENT_ITEM_TYPE);
            startActivityForResult(intent, 1);

所以,我认为将数据保存到 SD 卡是实现此目的的唯一方法。找了很多资料,总是提示没有权限将数据存入SD卡。错误信息如下。

01-17 23:35:44.184 6337-6337/? W/System.err: java.io.FileNotFoundException: /storage/emulated/0/rtd: open failed: EACCES (Permission denied)
01-17 23:35:44.184 6337-6337/? W/System.err:     at libcore.io.IoBridge.open(IoBridge.java:452)
01-17 23:35:44.185 6337-6337/? W/System.err:     at java.io.FileOutputStream.<init>(FileOutputStream.java:87)
01-17 23:35:44.185 6337-6337/? W/System.err:     at java.io.FileOutputStream.<init>(FileOutputStream.java:72)

事实上,我确实在 AndroidManifest

中添加了权限行
</activity>

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

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

所以,谁能帮我弄清楚我应该怎么做才能解决这个错误? 这是我保存按钮的代码

 class ButtonClickListener2 implements View.OnClickListener{
        @Override
        public void onClick(View v){
      //      Intent intent = getIntent();
            Name = getIntent().getStringExtra("Name");
            Age = getIntent().getStringExtra("Age");
            Movie = getIntent().getStringExtra("Movie");
            File2 = getIntent().getStringExtra("File");
            TextView txt = (TextView)findViewById(R.id.textView3);
            txt.setText(Name+" "+ Age+ " "+Movie+" "+ File2);
            String filename = File2.toString();
            String Age_Content = Age.toString();
            String Movie_Content = Movie.toString();
            String Name_Content = Name.toString();
            FileService service = new FileService(getApplicationContext());
            try {
                if(Environment.getExternalStorageState().equals(Environment.getExternalStorageState())){
                    service.save(filename, Age_Content, Movie_Content,Name_Content);
                    Toast.makeText(getApplicationContext(),R.string.SDCard_available,Toast.LENGTH_SHORT).show();
                }else{
                    Toast.makeText(getApplicationContext(),R.string.SDCard_protected,Toast.LENGTH_SHORT).show();
                }
                Toast.makeText(getApplicationContext(),R.string.success,Toast.LENGTH_SHORT).show();
            } catch (Exception e) {
                Toast.makeText(getApplicationContext(),R.string.fail,Toast.LENGTH_SHORT).show();
                e.printStackTrace();
            }


        }
    }
    class FileService {
        private Context context;
        public FileService (Context context) {
            this.context = context;
        }
        public void save(String filename, String Age_content, String Movie_content, String Name_content) throws Exception{
            //save the data into SD card
           /* FileOutputStream outputStream = context.openFileOutput(filename,Context.MODE_APPEND);
            outputStream.write(Age_content.getBytes());
            outputStream.write(Movie_content.getBytes());
            outputStream.write(Name_content.getBytes());
            outputStream.close();*/
            File file = new File(Environment.getExternalStorageDirectory(),filename);
            FileOutputStream outputStream = new FileOutputStream(file);
            outputStream.write(Age_content.getBytes());
            outputStream.write(Movie_content.getBytes());
            outputStream.write(Name_content.getBytes());
            outputStream.close();
        }
    }

如果您使用的是 Android M,试试这个:

private final String[] permissions = {Manifest.permission.READ_EXTERNAL_STORAGE};
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
        requestPermissions(permissions, 2909);

此外,重写 onRequestPermissionsResult 方法如下:

 @Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}

您的 activity 必须扩展 AppCompatActivity 才能使其正常工作。 Android 在 6.0 版中引入了运行时权限。你可能想调查一下。

In your manifests file put the below code 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

检查您是否在 AndroidManifest.xml

中使用了 PERMISSIONS
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_INTERNAL_STORAGE" />