当前位置: 首页 > 知识库问答 >
问题:

Android:外部写权限[重复]

沈华晖
2023-03-14
public void buttonSave(View view) {
    //File directory = new File(path);
    File directoryFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath(), "");
    directoryFile.mkdirs();
    File file = new File(directoryFile, "savefile.txt");
    try {
        file.createNewFile();
    } catch (IOException e) {;}

    eV = (EditText)findViewById(R.id.editText_box);
    String[] editTextValue = eV.getText().toString().split(" ");

    Save(file, editTextValue);
}

public void Save(File file, String[] data){
    FileOutputStream foe = null;
    Toast.makeText(getApplicationContext(), Integer.toString(data.length), Toast.LENGTH_SHORT).show();

    try {
        foe = new FileOutputStream(file);
    } catch (FileNotFoundException e) {
        Toast.makeText(getApplicationContext(), "error", Toast.LENGTH_SHORT).show();
    }
    try {
        for (int i=0; i<data.length; i++){
            foe.write(data[i].getBytes());
            if (i<data.length){
                foe.write("\n".getBytes());
            }
        }
    } catch (IOException e) {};
    try {
        foe.close();
    } catch (IOException e) {};
}
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="home.learningapp2">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

有什么建议吗?它不工作在模拟器或当我在我的手机上运行它。

共有1个答案

辛健
2023-03-14

首先,您应该在清单文件中获得权限:

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

然后您应该获得运行时权限,将以下方法添加到您的活动中:

private boolean checkPermission() {
    int result = ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.READ_EXTERNAL_STORAGE);
    int result1 = ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE);
    return result == PackageManager.PERMISSION_GRANTED && result1 == PackageManager.PERMISSION_GRANTED;
}

private void requestPermission() {
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.WRITE_EXTERNAL_STORAGE}, 100);
}

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
        case 100:
            if (grantResults.length > 0) {
                boolean locationAccepted = grantResults[0] == PackageManager.PERMISSION_GRANTED;
                boolean cameraAccepted = grantResults[1] == PackageManager.PERMISSION_GRANTED;
                if (locationAccepted && cameraAccepted)
                    Toast.makeText(this, "Permission Granted, Now you can access", Toast.LENGTH_LONG).show();
                else {
                    Toast.makeText(this, "Permission Denied", Toast.LENGTH_LONG).show();
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                        if (shouldShowRequestPermissionRationale(Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                            showMessageOKCancel("You need to allow access to both the permissions",
                                    new DialogInterface.OnClickListener() {
                                        @Override
                                        public void onClick(DialogInterface dialog, int which) {
                                            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                                                requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE},
                                                        100);
                                            }
                                        }
                                    });
                            return;
                        }
                    }

                }
            }


            break;
    }
}


private void showMessageOKCancel(String message, DialogInterface.OnClickListener okListener) {
    new AlertDialog.Builder(MainActivity.this)
            .setMessage(message)
            .setPositiveButton("OK", okListener)
            .setNegativeButton("Cancel", null)
            .create()
            .show();
}

然后更改onCreate()方法:

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

    if (checkPermission()) {
        Toast.makeText(this, "Permission already granted.", Toast.LENGTH_LONG).show();
    } else {
        Toast.makeText(this, "Please request permission.", Toast.LENGTH_LONG).show();
    }

    if (!checkPermission()) {
        requestPermission();
    } else {
        Toast.makeText(this, "Permission already granted.", Toast.LENGTH_LONG).show();
    }

}
 类似资料:
  • 在这一点上我得到了警告: 如何让它保存文件?当我在Eclipse上创建它时,这是可行的,但是现在我更新并移到了Android Studio中,它似乎坏了一些东西。

  • 我试图找到所有的mp3文件在存储,但我的应用程序崩溃,我使用logcat看看为什么和问题的权限访问外部存储,但我已经把权限在清单,我不知道为什么不断崩溃。第一个错误: 03-06 14:55:24.553:E/dex2OAT(2796):创建oat文件失败:/data/dalvik-cache/x86/data@app@felipe.cursoandroid.com.musicbox-2@spli

  • 我试图在android中写入文件,但一直出现以下错误: java.io.FileNotFoundException: /storage/emulated/0/Notes/TestFile.txt(权限拒绝) 搜索此网站可以简单地解决此问题,即向应用程序清单文件添加WRITE\u EXTERNAL\u存储,但这对我不起作用。我一直在犯同样的错误。

  • 问题内容: 我知道Android 6.0具有新的权限,我知道可以使用类似这样的名称 今天,我看到了一个需要3个权限的Google应用:联系人,短信和摄像头。它正在制作第1-3页,并同时将它们一起调用以激活。 有人可以告诉我如何调用4个权限来同时激活短信,摄像头,联系人和存储吗? 示例(忘记了Google应用的名称:() 该应用需要短信,联系人和相机 该应用程序问我(并在第1-3页建立了对话框)激活

  • 我的应用程序的目标SdkVersion=29 我拍了一张照片,它保存在路径: src=/storage/simulated/0/DCIM/Camera/IMG_20201120_091943。jpg 然后我想使用FileInputStream/FileOutputStream将此图像复制到内部存储。虽然,我的应用程序有WRITE/READ存储权限,但当我编码 我收到了一个FileNotFoundE

  • 我正在尝试创建一个简单的应用程序,该应用程序可以从图库应用程序获取图像并将其显示在图像按钮上。我正在运行 Android 5.0.1 的手机上使用 API 21 进行测试。不幸的是,无论我尝试什么,我都会收到安全错误 - 即使我指定了权限。 我获取和检索图像的代码是: 当我尝试从Dropbox中选择图像时,代码有效,但当我从图库中选择图像时,我得到 我将READ_EXTERNAL_STORAGE的