我目前还不确定我的应用程序有什么问题。我认为问题是要求写入SD卡权限
目前我可以将文件从内部存储器移动到带有内部存储器的文件。当我尝试在SD卡文件中执行相同操作时出现问题
一个问题可能是当我搜索SD卡内的文件时,我正在硬编码路径。原因是当我调用方法时:
Environment.getExternalStorageDirectory().toString();
//should return the path of the SD card but returns internal device memory
由于此方法返回设备内存,因此没有其他方法可以返回SD卡的路径。我进入了android设备监视器,在文件管理器下,我发现SD卡的路径是" / storage / 57e5-053e"。 我已经从我的计算机中放入了文件,并通过设备监视器验证了文件存储在那里。
我所尝试的是检查SD卡的状态,并允许我的应用程序从清单以及我认为正确的编程方式获得写入权限。
当我使用SD卡内的路径创建文件时,可以看到问题,并且我调用始终返回false的canWrite()
方法。
但是我可以在文件上调用canRead()
方法,它总是返回true
我已经在这个问题上工作了一个星期,我还没有找到解决方案,所以任何帮助都会受到赞赏。
如果在设备内存中完成,则尝试移动文件
try{
File afile =new File("/storage/57E5-053E/Android/data");
if( afile.canWrite())
{
Toast.makeText(MainActivity.this, "CAN WRITE TO FILE", Toast.LENGTH_SHORT).show();
}
if(afile.renameTo(new File("/storage/57E5-053E/TESTDATA/")))
{
Toast.makeText(MainActivity.this, "FILE MOVED SUCCESSFULLY", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(MainActivity.this, "FILE FAILED TO MOVE", Toast.LENGTH_SHORT).show();
}
}catch(Exception e){
e.printStackTrace();
}
明确要求获得许可
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".createDir"
android:theme="@style/AppTheme" />
<activity
android:name=".activity_delete"
android:theme="@style/AppTheme" />
<activity android:name=".moveKnox"></activity>
</application>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission-sdk-23 android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
确保我可以写到外部存储
public boolean isStoragePermissionGranted()
{
if(Build.VERSION.SDK_INT >=23)//works
{
if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)
{
Log.v(TAG, "Permission Granted");
return true;
} else
{
Log.v(TAG, "Permission NOT Granted");
ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
return false;
}
}
else
Log.v(TAG, "Permission Granted");
return true;
}
确认SD卡可用
void ExtraState()
{
boolean mExternalStorageAvailable = false;
boolean mExternalStorageWriteable = false;
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
// We can read and write the media
mExternalStorageAvailable = mExternalStorageWriteable = true;
// Toast.makeText(MainActivity.this, "CAN WRITE",Toast.LENGTH_SHORT).show();
} else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
// We can only read the media
mExternalStorageAvailable = true;
mExternalStorageWriteable = false;
Toast.makeText(MainActivity.this, "CAN READ ONLY",Toast.LENGTH_SHORT).show();
} else {
// Something else is wrong. It may be one of many other states, but all we need
// to know is we can neither read nor write
mExternalStorageAvailable = mExternalStorageWriteable = false;
Toast.makeText(MainActivity.this, "NOT AVAILABLE",Toast.LENGTH_SHORT).show();
}
}