我在Android M中创建文件时遇到问题.
我在Android 6.0.1中使用Nexus 9.然后我在我的项目中设置如下:
android { defaultConfig { targetSdkVersion 23 ... } }
public class MainActivity extends AppCompatActivity { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); String storagePath = Environment.getExternalStorageDirectory().getAbsolutePath(); String rootPath = storagePath + "/test"; String fileName = "/test.zip"; File root = new File(rootPath); if(!root.mkdirs()) { Log.i("Test", "This path is already exist: " + root.getAbsolutePath()); } File file = new File(rootPath + fileName); try { if (!file.createNewFile()) { Log.i("Test", "This file is already exist: " + file.getAbsolutePath()); } } catch (Exception e) { e.printStackTrace(); } }
Build是成功的,应用程序已经启动,但是我得到了这样的异常消息:
01-07 18:13:40.669 18027-18027/com.sample.myapplication W/System.err: java.io.IOException: open failed: ENOENT (No such file or directory) 01-07 18:13:40.669 18027-18027/com.sample.myapplication W/System.err: at java.io.File.createNewFile(File.java:939) 01-07 18:13:40.669 18027-18027/com.sample.myapplication W/System.err: at com.sample.myapplication.MainActivity.onCreate(MainActivity.java:36) 01-07 18:13:40.670 18027-18027/com.sample.myapplication W/System.err: at android.app.Activity.performCreate(Activity.java:6251) 01-07 18:13:40.670 18027-18027/com.sample.myapplication W/System.err: at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107) 01-07 18:13:40.670 18027-18027/com.sample.myapplication W/System.err: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369) 01-07 18:13:40.670 18027-18027/com.sample.myapplication W/System.err: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 01-07 18:13:40.670 18027-18027/com.sample.myapplication W/System.err: at android.app.ActivityThread.-wrap11(ActivityThread.java) 01-07 18:13:40.671 18027-18027/com.sample.myapplication W/System.err: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 01-07 18:13:40.671 18027-18027/com.sample.myapplication W/System.err: at android.os.Handler.dispatchMessage(Handler.java:102) 01-07 18:13:40.671 18027-18027/com.sample.myapplication W/System.err: at android.os.Looper.loop(Looper.java:148) 01-07 18:13:40.671 18027-18027/com.sample.myapplication W/System.err: at android.app.ActivityThread.main(ActivityThread.java:5417) 01-07 18:13:40.671 18027-18027/com.sample.myapplication W/System.err: at java.lang.reflect.Method.invoke(Native Method) 01-07 18:13:40.671 18027-18027/com.sample.myapplication W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 01-07 18:13:40.671 18027-18027/com.sample.myapplication W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 01-07 18:13:40.671 18027-18027/com.sample.myapplication W/System.err: Caused by: android.system.ErrnoException: open failed: ENOENT (No such file or directory) 01-07 18:13:40.671 18027-18027/com.sample.myapplication W/System.err: at libcore.io.Posix.open(Native Method) 01-07 18:13:40.671 18027-18027/com.sample.myapplication W/System.err: at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186) 01-07 18:13:40.671 18027-18027/com.sample.myapplication W/System.err: at java.io.File.createNewFile(File.java:932) 01-07 18:13:40.671 18027-18027/com.sample.myapplication W/System.err: ... 13 more
我怎么解决这个问题?我没有抓到我想念的东西......
请帮忙.
我编辑我的代码:添加"请求检查权限"代码onCreate
.
谢谢,拉尔托.
我不知道运行时权限.
我解决了这样的异常:
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); /* Request user permissions in runtime */ ActivityCompat.requestPermissions(MainActivity.this, new String[] { Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE }, 100); /* Request user permissions in runtime */ String storagePath = Environment.getExternalStorageDirectory().getAbsolutePath(); String rootPath = storagePath + "/test"; String fileName = "/test.zip"; File root = new File(rootPath); if(!root.mkdirs()) { Log.i("Test", "This path is already exist: " + root.getAbsolutePath()); } File file = new File(rootPath + fileName); try { int permissionCheck = ContextCompat.checkSelfPermission(MainActivity.this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE); if (permissionCheck == PackageManager.PERMISSION_GRANTED) { if (!file.createNewFile()) { Log.i("Test", "This file is already exist: " + file.getAbsolutePath()); } } } catch (Exception e) { e.printStackTrace(); } } @TargetApi(23) @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { switch (requestCode) { case 100: if (grantResults.length > 0 || grantResults[0] == PackageManager.PERMISSION_GRANTED || grantResults[1] == PackageManager.PERMISSION_GRANTED) { /* User checks permission. */ } else { Toast.makeText(MainActivity.this, "Permission is denied.", Toast.LENGTH_SHORT).show(); finish(); } //return; // delete. } } }
有用!