无法使用文件类

时间:2016-01-15 13:24:13

标签: android file class

我试图通过我的应用程序删除音乐文件,但无法实现。我用

检查了
boolean exists = temp.exists();
boolean isFile = temp.isFile();

如果有,那是的。这些方法让我回归真实。 但是当我来到删除方法时:

boolean deleted = temp.delete();

它返回False,文件没有被删除。没有Exception只会返回我删除的变量。

我也在使用这些许可证:

<uses-permission android:name="android.permission.MEDIA_CONTENT_CONTROL" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.ACTION_HEADSET_PLUG"/>

有人想出一个解决方案吗? (或者我可以使用的其他课程?)

编辑: 那是我的完整代码

File temp = new File(str_path);

boolean exists = temp.exists();
boolean isFile = temp.isFile();

if (exists)) {
    boolean deleted = temp.delete();
    if (deleted) {
        Toast.makeText(context, "Successful deleted " + Title_Artist, Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(context, "Not able to delete file " + Title_Artist, Toast.LENGTH_SHORT).show();
            }
        }

(我在调试时检查了对象是否有自己的路径并且有了它)

4 个答案:

答案 0 :(得分:3)

删除文件音乐必须完成两项任务:

  1. 删除存储中的文件。

    public static boolean delete(File path) {
        boolean result = true;
        if (path.exists()) {
            if (path.isDirectory()) {
                for (File child : path.listFiles()) {
                    result &= delete(child);
                }
                result &= path.delete(); // Delete empty directory.
            }
            if (path.isFile()) {
            result &= path.delete();
            }
            if (!result) {
                Log.e("Delete", "Delete failed;");
            }
            return result;
        } else {
            Log.e("Delete", "File does not exist.");
            return false;
        }
    }
    
  2. 从MediaStore中删除文件:

    public static void deleteFileFromMediaStore(final ContentResolver contentResolver, final File file) {
        int sdk = android.os.Build.VERSION.SDK_INT;
        if (sdk >= android.os.Build.VERSION_CODES.HONEYCOMB) {
           String canonicalPath;
           try {
               canonicalPath = file.getCanonicalPath();
           } catch (IOException e) {
               canonicalPath = file.getAbsolutePath();
           }
           final Uri uri = MediaStore.Files.getContentUri("external");
           final int result = contentResolver.delete(uri,
                    MediaStore.Files.FileColumns.DATA + "=?", new String[]{canonicalPath});
           if (result == 0) {
               final String absolutePath = file.getAbsolutePath();
               if (!absolutePath.equals(canonicalPath)) {
                contentResolver.delete(uri,
                        MediaStore.Files.FileColumns.DATA + "=?", new String[]{absolutePath});
                }
            }
        }
    }
    
  3. 您可以重置/重新扫描MediaStore,而不是执行上面的某些代码。

    注意:如果从SD卡和android 4.4 +

    中删除
      

    更改Android 4.4 + :不允许应用写入(删除,修改   ...)除了特定于包的目录之外的外部存储器。

答案 1 :(得分:2)

评论中的路径看起来就像文件位于可移动SD卡上。您需要Android 4.4+上的特殊权限才能管理或删除SD卡上的文件。您需要使用DocumentFile#delete()

有关使用DocumentFile访问可移动SD卡上的文件的帮助,请参阅以下StackOverflow帖子:

How to use the new SD card access API presented for Android 5.0 (Lollipop)?

如FX文件管理器开发人员所解释的那样,如果不使用DocumentFile,也可以使用hack:http://forum.xda-developers.com/showpost.php?p=52151865

答案 2 :(得分:0)

由于您正在检查该文件是否存在,因此只能有一个原因导致您无法删除该文件:您无权执行此操作。

应用无法删除系统文件或其他应用的文件。

答案 3 :(得分:0)

假设您的文件路径为

Environment.getExternalStorageDirectory().getPath()
                        + "/Music"
                        + "/"
                        + "song.mp3"

像这样删除它

File dir = new File(Environment.getExternalStorageDirectory()
                        .getPath()
                        + "/Music");

if (dir.isDirectory()) {new File(dir, song.mp3).delete();}

如果要删除音乐文件夹中的所有文件,请执行此操作

if (dir.isDirectory()) {
                    String[] children = dir.list();
                    for (int i = 0; i < children.length; i++) {
                        new File(dir, children[i]).delete();
                    }
                }