我有这个代码用于创建保存图片的目录:
File storageDir = null;
if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
storageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "myphoto");
if (!storageDir.mkdirs()) {
if (!storageDir.exists()){
Log.d("photo", "failed to create directory");
return null;
}
}
}
return storageDir;
Run Code Online (Sandbox Code Playgroud)
storeDir"/storage/emulated/0/Pictures/myphoto/"在android 6下面返回,在android 6上它返回null.
我有许可 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
buildToolVersion 23
targetSdkVersion 23
怎么修?
我编写了一个Android应用程序,使用DownloadManager将示例PDF文件下载到下载目录.这是代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_vertretungsplan);
Button dlbutton = (Button) findViewById(R.id.buttondownload);
final Context c = this;
dlbutton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(myurl));
request.setTitle("Vertretungsplan");
request.setDescription("wird heruntergeladen");
request.allowScanningByMediaScanner();
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
String filename = URLUtil.guessFileName(myurl, null, MimeTypeMap.getFileExtensionFromUrl(myurl));
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, filename);
DownloadManager manager = (DownloadManager) c.getSystemService(Context.DOWNLOAD_SERVICE);
manager.enqueue(request);
}
});
}
Run Code Online (Sandbox Code Playgroud)
现在,我尝试在我的Xperia Z3 Android 6.0上从Android Studio调试运行它.当我点击下载按钮时,会发生以下错误:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.markwitt.schul_app, PID: 29297
java.lang.SecurityException: No permission to write to /storage/emulated/0/Download/hrpsampletable.pdf: Neither user 10047 nor current …Run Code Online (Sandbox Code Playgroud) xml android android-manifest android-permissions android-download-manager
我的应用程序将缓存文件写入(并读取)到getExternalCacheDir()位置.在Android Lollipop(API 21)之前,我一直在使用此权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="18" />
Run Code Online (Sandbox Code Playgroud)
maxSdkVersion存在,因为在API v18之后不应该需要此权限:http: //developer.android.com/reference/android/Manifest.permission.html#WRITE_EXTERNAL_STORAGE
但是在Android Lollipop(5.0)上,我获得了这样的访问权限(使用我的日志输出来显示实际使用的路径):
11-19 13:01:59.257 4462-4541/com.murrayc.galaxyzoo.app E/android-galaxyzoo? createCacheFile(): IOException for filename=/storage/emulated/0/Android/data/com.murrayc.galaxyzoo.app/cache/52
java.io.IOException: open failed: EACCES (Permission denied)
at java.io.File.createNewFile(File.java:941)
at com.murrayc.galaxyzoo.app.provider.ItemsContentProvider.createCacheFile(ItemsContentProvider.java:528)
Run Code Online (Sandbox Code Playgroud)
我在模拟器和我的Nexus 4中看到了这一点.有什么变化,或者我一直在做错什么?我只是想访问我自己的应用程序的缓存.
更新:我现在只在我的设备上看到这一点(运行标准Android 5.1.1的Nexus 4,自从我第一次遇到这个问题以来,它甚至有了新的Android重新刷新).我不再在模拟器中看到这一点 - 当然系统图像已经多次更新.
在android M 中访问sdcard必须在运行时授予权限时强制停止并启动app,如何以编程方式实现?
但是,如果应用程序强制停止并重新启动,则可以访问sdcard.
AndroidManifest.xml:
uses-permission-sdk-m android:name="android.permission.WRITE_EXTERNAL_STORAGE
/* **Checking permission **
if doesn't have request
else
browse file directory
*/
String[] perm = { Manifest.permission.WRITE_EXTERNAL_STORAGE };
if (checkSelfPermission(perm[0]) == PackageManager.PERMISSION_DENIED) {
requestPermissions(perm, REQ);
} else {
Explore(); //method to browse file directory
}
Run Code Online (Sandbox Code Playgroud)
onRequestPermissionsResult
@Override
public void onRequestPermissionsResult(int requestCode,
String[] permissions, int[] grantResults) {
// TODO Auto-generated method stub
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//Not able to browse SD card until restart application
Explore(); //method to browse file directory …Run Code Online (Sandbox Code Playgroud)