35

アプリケーションから画像ファイルを削除しています。やっていた

new  File(filename).delete ();

これは実際にファイルを削除していました。しかし、画像はまだギャラリーに表示されていました。

検索で私は使用する必要があることがわかりました

getContentResolver().delete(Uri.fromFile(file), null,null);削除するには

しかし、ここで私は例外を取得しています:

不明なファイルのURL。java.lang.IllegalArgumentException:不明なURLファイル:/// mnt / sdcard / DCIM / Camera / IMG_20120523_122612.jpg

ファイルブラウザで見ると、この特定の画像が表示されます。この問題を解決するのを手伝ってください。画像が物理的に削除されたときにギャラリーを更新する他の方法はありますか

4

10 に答える 10

36

以下のコードを使用してください、それはあなたを助けるかもしれません。

File fdelete = new File(file_dj_path);
if (fdelete.exists()) {
    if (fdelete.delete()) {
        System.out.println("file Deleted :" + file_dj_path);
    } else {
        System.out.println("file not Deleted :" + file_dj_path);
    }
}

画像を削除した後にギャラリーを更新するには、以下のコードを使用してブロードキャストを送信します

(<KITKAT API 14の場合)

 sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,
 Uri.parse("file://" +  Environment.getExternalStorageDirectory())));

> = KITKAT API 14の場合、以下のコードを使用します

MediaScannerConnection.scanFile(this, new String[] { Environment.getExternalStorageDirectory().toString() }, null, new MediaScannerConnection.OnScanCompletedListener() {
            /*
             *   (non-Javadoc)
             * @see android.media.MediaScannerConnection.OnScanCompletedListener#onScanCompleted(java.lang.String, android.net.Uri)
             */
            public void onScanCompleted(String path, Uri uri) 
              {
                  Log.i("ExternalStorage", "Scanned " + path + ":");
                  Log.i("ExternalStorage", "-> uri=" + uri);
              }
            });

なぜなら:

ACTION_MEDIA_MOUNTED

KITKAT(API 14)では非推奨です。


2015年4月9日編集

以下のコードの動作の細かいチェック

public void deleteImage() {
        String file_dj_path = Environment.getExternalStorageDirectory() + "/ECP_Screenshots/abc.jpg";
        File fdelete = new File(file_dj_path);
        if (fdelete.exists()) {
            if (fdelete.delete()) {
                Log.e("-->", "file Deleted :" + file_dj_path);
                callBroadCast();
            } else {
                Log.e("-->", "file not Deleted :" + file_dj_path);
            }
        }
    }

    public void callBroadCast() {
        if (Build.VERSION.SDK_INT >= 14) {
            Log.e("-->", " >= 14");
            MediaScannerConnection.scanFile(this, new String[]{Environment.getExternalStorageDirectory().toString()}, null, new MediaScannerConnection.OnScanCompletedListener() {
                /*
                 *   (non-Javadoc)
                 * @see android.media.MediaScannerConnection.OnScanCompletedListener#onScanCompleted(java.lang.String, android.net.Uri)
                 */
                public void onScanCompleted(String path, Uri uri) {
                    Log.e("ExternalStorage", "Scanned " + path + ":");
                    Log.e("ExternalStorage", "-> uri=" + uri);
                }
            });
        } else {
            Log.e("-->", " < 14");
            sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,
                    Uri.parse("file://" + Environment.getExternalStorageDirectory())));
        }
    }

以下はログです

09-04 14:27:11.085    8290-8290/com.example.sampleforwear E/-->﹕ file Deleted :/storage/emulated/0/ECP_Screenshots/abc.jpg
09-04 14:27:11.085    8290-8290/com.example.sampleforwear E/-->﹕ >= 14
09-04 14:27:11.152    8290-8290/com.example.sampleforwear E/﹕ appName=com.example.sampleforwear, acAppName=/system/bin/surfaceflinger
09-04 14:27:11.152    8290-8290/com.example.sampleforwear E/﹕ 0
09-04 14:27:15.249    8290-8302/com.example.sampleforwear E/ExternalStorage﹕ Scanned /storage/emulated/0:
09-04 14:27:15.249    8290-8302/com.example.sampleforwear E/ExternalStorage﹕ -> uri=content://media/external/file/2416
于 2012-05-23T09:08:12.533 に答える
35

私はの使用を示唆する多くの答えを見てきました

sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" +  Environment.getExternalStorageDirectory())));

これは機能しますが、メディアスキャナーがデバイス上のメディアを再スキャンします。より効率的なアプローチは、MediaStoreコンテンツプロバイダーを介してクエリ/削除することです。

// Set up the projection (we only need the ID)
String[] projection = { MediaStore.Images.Media._ID };

// Match on the file path
String selection = MediaStore.Images.Media.DATA + " = ?";
String[] selectionArgs = new String[] { file.getAbsolutePath() };

// Query for the ID of the media matching the file path
Uri queryUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
ContentResolver contentResolver = getContentResolver();
Cursor c = contentResolver.query(queryUri, projection, selection, selectionArgs, null);
if (c.moveToFirst()) {
    // We found the ID. Deleting the item via the content provider will also remove the file
    long id = c.getLong(c.getColumnIndexOrThrow(MediaStore.Images.Media._ID));
    Uri deleteUri = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, id);
    contentResolver.delete(deleteUri, null, null);
} else {
    // File not found in media store DB
}
c.close();
于 2013-12-26T06:51:23.783 に答える
24
File file = new File(photoUri);
file.delete();

context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(new File(photoUri))));

このコードは私にとってはうまくいき、SDカード全体を再マウントするよりも良いと思いますIntent.ACTION_MEDIA_MOUNTED

于 2014-09-23T09:36:16.850 に答える
18

画像を削除するには、

ContentResolver contentResolver = getContentResolver();
contentResolver.delete(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
            MediaStore.Images.ImageColumns.DATA + "=?" , new String[]{ imagePath });
于 2015-05-22T17:45:25.667 に答える
5

私はこれらすべての解決策を試しましたが、Android 6
ではうまくいきませんでした。結局、このコードの一部がうまく機能していることがわかりました。

public static void deleteFileFromMediaStore(final ContentResolver contentResolver, final File file) {
    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});
        }
    }
}

これもAndroid4.4と5.1でテストしましたが、完全に機能します。

于 2016-03-29T23:31:05.320 に答える
4
sendBroadcast(new Intent(
           Intent.ACTION_MEDIA_MOUNTED,
           Uri.parse("file://" +  Environment.getExternalStorageDirectory())));

このコードは機能しますが、リソースが非常に高くなります。SDカードをアンマウントしてからマウントします。これは、一部のアプリケーションに影響を与えたり、ギャラリーを更新するために膨大なシステムリソースを使用したりする可能性があります。私はまだ最良の代替案を探しています。もし私がそれを手に入れたら投稿します。

于 2012-09-22T13:45:33.823 に答える
3

Kotlinではこれを行うことができます:

private fun deleteImage(path: String) {
    val fDelete = File(path)
    if (fDelete.exists()) {
        if (fDelete.delete()) {
            MediaScannerConnection.scanFile(this, arrayOf(Environment.getExternalStorageDirectory().toString()), null) { path, uri ->
                Log.d("debug", "DONE")
            }
        } 
    }
}
于 2018-09-06T08:37:17.257 に答える
1

同じ問題が発生し、画像を削除するために3つの異なる方法を試しました。時々それは働いていました時々それはそうではありませんでした。あまりにも多くの時間を費やした後、私が持っているすべてのメソッドは画像を削除します。私が言いたいのは、ビットマップの処理に注意してください。私は写真を撮っていましたが、それを永続化してから、必要に応じて回転させます。

public static Bitmap rotatePictureToPortraitMode(String filePath, Bitmap myBitmap) {
try {
    ExifInterface exif = new ExifInterface(filePath);
    int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 1);
    Log.d("EXIF", "Exif: " + orientation);
    Matrix matrix = new Matrix();
    if (orientation == 6) {
        matrix.postRotate(90);
    } else if (orientation == 3) {
        matrix.postRotate(180);
    } else if (orientation == 8) {
        matrix.postRotate(270);
    }
    myBitmap = Bitmap.createBitmap(myBitmap, 0, 0, myBitmap.getWidth(), myBitmap.getHeight(), matrix, true); // rotating bitmap
} catch (Exception e) {

}
return myBitmap;
}

その後、画像を削除しようとしましたが、前に言ったように、機能しませんでした。このメソッドを削除すると、問題を解決するのに役立ちました。

これは私の問題だったのかもしれませんが、これを削除するとすぐに大いに役立ちました。そのため、画像の処理方法に注意してください。私の場合、私は前述の答えを使用しました:

File file = new File(photoUri);
file.delete();

context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, 
Uri.fromFile(new File(photoUri)))); 

それが役に立てば幸い!

于 2018-12-06T17:28:09.187 に答える
0
public static boolean deltefolderwithimages(File dir) {
    if (dir.isDirectory()) {
        String[] children = dir.list();
        for (int i=0; i<children.length; i++) {
            boolean success = deltefolderwithimages(new File(dir, children[i]));
            if (!success) {
                return false;
            }
        }
    }
    return dir.delete();
}
于 2019-08-28T07:22:08.387 に答える
0

DocumentFile.fromSingleUri(context, uri).delete();

私のために素晴らしい仕事

于 2020-09-24T09:29:06.393 に答える