Android-创建新文件的权限被拒绝
我试图在安卓系统中创建一个文件,即使在遵循所有其他答案后,我仍然被拒绝了权限。saveImage()方法中发生错误Android-创建新文件的权限被拒绝,android,Android,我试图在安卓系统中创建一个文件,即使在遵循所有其他答案后,我仍然被拒绝了权限。saveImage()方法中发生错误 在舱单中: <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission and
在舱单中:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
我遗漏了什么?…这不是Android权限问题。相反,
异常
是由于Linux权限引起的,尽管是无意中造成的
在实例化saveImage()
中使用的文件时,您将新文件/目录的名称连接到Environment.getExternalStorageDirectory()
;e、 例如,对于壁纸目录
:
new File(Environment.getExternalStorageDirectory() + "TEST_APP_PHOTO_FOLDER")
这是在环境.getExternalStorageDirectory()
上隐式调用toString()
,并直接将名称附加到它,中间没有必要的路径分隔符,因此最终得到的全名类似于/storage/emulated/0TEST\u APP\u PHOTO\u文件夹
。这指的是外部存储目录父目录中的文件,您在那里没有写访问权限,因此出现异常
只需将文件
实例化更改为使用构造函数,该构造函数接受单独的文件
和字符串
参数;第一个用于父目录,第二个用于名称。基本上,将加号改为逗号。例如:
new File(Environment.getExternalStorageDirectory(), "TEST_APP_PHOTO_FOLDER")
您的文件中缺少路径分隔符。将saveImage()
中壁纸目录的文件实例化更改为新的文件(Environment.getExternalStorageDirectory(),“TEST_APP_PHOTO_FOLDER”)
;注意逗号而不是加号。您也需要对文件f
执行相同的操作。现在,它正试图在外部存储目录的父目录中创建您无权访问的文件。
@Override //ON REQUEST PERMISSION RESULT,
//I ACCEPTED THE PERMISSION, THE CODE HERE WAS EXECUTED AS IT SHOULD
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case 1: {
Log.d(TAG,"THIS IS FOR THE WRITE/READ PERMISSIONS");
Log.d(TAG,grantResults.toString());
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Log.d(TAG,"[Persmission accepted for writing/reading]");
// permission was granted, yay! Do the
// camera related task you need to do.
} else {
Log.d(TAG,"[Permission denied]");
// permission denied, boo! Disable the
// functionality that depends on this permission.
}
}
// other 'case' lines to check for other
// permissions this app might request.
}
}
//THE METHOD WHERE THE ERROR HAPPENS
public String saveImage(Bitmap myBitmap) {
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
myBitmap.compress(Bitmap.CompressFormat.JPEG, 90, bytes);
File wallpaperDirectory = new File(
Environment.getExternalStorageDirectory() + "TEST_APP_PHOTO_FOLDER");
// have the object build the directory structure, if needed.
if (!wallpaperDirectory.exists()) {
wallpaperDirectory.mkdirs();
}
try {
File f = new File(wallpaperDirectory + "testfile.jpg");
f.mkdirs();
f.createNewFile(); // <--- STACK TRACE POINTS HERE
FileOutputStream fo = new FileOutputStream(f);
..
..
..
java.io.IOException: Permission denied
at java.io.UnixFileSystem.createFileExclusively0(Native Method)
at java.io.UnixFileSystem.createFileExclusively(UnixFileSystem.java:281)
at java.io.File.createNewFile(File.java:1000)
at car.andrej.tradingapp.ProfileActivity.ProfileActivity.saveImage(ProfileActivity.java:263)
at car.andrej.tradingapp.ProfileActivity.ProfileActivity.onActivityResult(ProfileActivity.java:220)
at android.app.Activity.dispatchActivityResult(Activity.java:7556)
at android.app.ActivityThread.deliverResults(ActivityThread.java:4487)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:4534)
at android.app.ActivityThread.-wrap20(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1752)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6944)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
new File(Environment.getExternalStorageDirectory() + "TEST_APP_PHOTO_FOLDER")
new File(Environment.getExternalStorageDirectory(), "TEST_APP_PHOTO_FOLDER")