画像をSDカードに保存しましたが、SDカードを取り外して元に戻すまで、ギャラリーアプリケーションに表示されません。
なぜそうなのか、何か分かりますか?
Galleryアプリケーションには、ファイルの保存時に更新されないキャッシュがあるようです...
実は、私はまた、ギャラリーアプリケーションでジャスト・保存した画像を開いていることとは成功していないにしたい
、これは、この問題についての私の質問ですが。
画像をSDカードに保存しましたが、SDカードを取り外して元に戻すまで、ギャラリーアプリケーションに表示されません。
なぜそうなのか、何か分かりますか?
Galleryアプリケーションには、ファイルの保存時に更新されないキャッシュがあるようです...
実は、私はまた、ギャラリーアプリケーションでジャスト・保存した画像を開いていることとは成功していないにしたい
、これは、この問題についての私の質問ですが。
回答:
システムは、マウントされたSDカードをスキャンして、新しいイメージ(およびその他の)ファイルを検出します。プログラムでファイルを追加する場合は、このクラスを使用できます。
http://developer.android.com/reference/android/media/MediaScannerConnection.html
より簡単な解決策は、静的簡易メソッドscanFile()を使用することです。
File imageFile = ...
MediaScannerConnection.scanFile(this, new String[] { imageFile.getPath() }, new String[] { "image/jpeg" }, null);
ここthis
で、アクティビティ(またはコンテキスト)はどこですか、mime-typeは、非標準のファイル拡張子を使用している場合にのみ必要null
で、オプションのコールバック用です(このような単純なケースでは必要ありません)。
元の質問およびこの問題が発生する可能性のある他の人への私の回答:
同じ問題がありました。私のアプリでSDカードに保存された画像がすぐにギャラリーに表示されませんでした。いくつか検索したところ、「sdcardに保存」コードの後に次の1行のコードが挿入されており、問題が修正されています。
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));
また、意図的に画像をメディアギャラリーに追加することもできます。コード例を見て、どのように行われるかを確認してください。
ContentValues image = new ContentValues();
image.put(Images.Media.TITLE, imageTitle);
image.put(Images.Media.DISPLAY_NAME, imageDisplayName);
image.put(Images.Media.DESCRIPTION, imageDescription);
image.put(Images.Media.DATE_ADDED, dateTaken);
image.put(Images.Media.DATE_TAKEN, dateTaken);
image.put(Images.Media.DATE_MODIFIED, dateTaken);
image.put(Images.Media.MIME_TYPE, "image/png");
image.put(Images.Media.ORIENTATION, 0);
File parent = imageFile.getParentFile();
String path = parent.toString().toLowerCase();
String name = parent.getName().toLowerCase();
image.put(Images.ImageColumns.BUCKET_ID, path.hashCode());
image.put(Images.ImageColumns.BUCKET_DISPLAY_NAME, name);
image.put(Images.Media.SIZE, imageFile.length());
image.put(Images.Media.DATA, imageFile.getAbsolutePath());
Uri result = context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, image);
Uri
が、挿入された画像がギャラリーに表示されないことが問題です。ギャラリーの最初と最後の両方で確認しました。挿入された画像がすぐにギャラリーに表示されるようにする方法を提案していただけますか?
Android KITKATを含むギャラリーの更新
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
{
Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
File f = new File("file://"+ Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES));
Uri contentUri = Uri.fromFile(f);
mediaScanIntent.setData(contentUri);
this.sendBroadcast(mediaScanIntent);
}
else
{
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory())));
}
MediaScannerConnectionのコードは次のとおりです。
MyMediaConnectorClient client = new MyMediaConnectorClient(newfile);
MediaScannerConnection scanner = new MediaScannerConnection(context, client);
client.setScanner(scanner);
scanner.connect();
newfileは、新規/保存されたファイルのFileオブジェクトです。
MyMediaConnectorClient
... の実装を提供するなら、あなたのソリューションが役立つと思うかもしれません
アクティビティに「MediaScannerConnectionClient」を実装させ、これをアクティビティに追加します。
private void startScan()
{
if(conn!=null) conn.disconnect();
conn = new MediaScannerConnection(YourActivity.this,YourActivity.this);
conn.connect();
}
@Override
public void onMediaScannerConnected() {
try{
conn.scanFile(yourImagePath, "image/*");
} catch (java.lang.IllegalStateException e){
}
}
@Override
public void onScanCompleted(String path, Uri uri) {
conn.disconnect();
}
Uri
、たとえば、画像のを:content://media/external/images/media/1231778
私とのこの仕事
File file = ..... // Save file
context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file)));
File folderGIF = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) + "/newgif2"); //path where gif will be stored
success = folderGIF.mkdir(); //make directory
String finalPath = folderGIF + "/test1.gif"; //path of file
.....
/* changes in gallery app if any changes in done*/
MediaScannerConnection.scanFile(this,
new String[]{finalPath}, null,
new MediaScannerConnection.OnScanCompletedListener() {
public void onScanCompleted(String path, Uri uri) {
Log.i("ExternalStorage", "Scanned " + path + ":");
Log.i("ExternalStorage", "-> uri=" + uri);
}
});
ここでは、画像をビットマップ形式でロードし、その画像をsdcardギャラリーのアプリ名フォルダーに保存できるコードを共有しています。次の手順に従ってください
private Bitmap loadBitmap(String url) {
try {
InputStream in = new java.net.URL(url).openStream();
return BitmapFactory.decodeStream(in);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
uses-permission android:name="android.permission.INTERNET"
uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
void saveMyImage(String appName, String imageUrl, String imageName) {
Bitmap bmImg = loadBitmap(imageUrl);
File filename;
try {
String path1 = android.os.Environment.getExternalStorageDirectory()
.toString();
File file = new File(path1 + "/" + appName);
if (!file.exists())
file.mkdirs();
filename = new File(file.getAbsolutePath() + "/" + imageName
+ ".jpg");
FileOutputStream out = new FileOutputStream(filename);
bmImg.compress(Bitmap.CompressFormat.JPEG, 90, out);
out.flush();
out.close();
ContentValues image = new ContentValues();
image.put(Images.Media.TITLE, appName);
image.put(Images.Media.DISPLAY_NAME, imageName);
image.put(Images.Media.DESCRIPTION, "App Image");
image.put(Images.Media.DATE_ADDED, System.currentTimeMillis());
image.put(Images.Media.MIME_TYPE, "image/jpg");
image.put(Images.Media.ORIENTATION, 0);
File parent = filename.getParentFile();
image.put(Images.ImageColumns.BUCKET_ID, parent.toString()
.toLowerCase().hashCode());
image.put(Images.ImageColumns.BUCKET_DISPLAY_NAME, parent.getName()
.toLowerCase());
image.put(Images.Media.SIZE, filename.length());
image.put(Images.Media.DATA, filename.getAbsolutePath());
Uri result = getContentResolver().insert(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, image);
Toast.makeText(getApplicationContext(),
"File is Saved in " + filename, Toast.LENGTH_SHORT).show();
} catch (Exception e) {
e.printStackTrace();
}
}
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));
KITKATでは動作しないようです。権限拒否例外をスローし、アプリをクラッシュさせます。このため、私は次のことを行いました、
String path = mediaStorageDir.getPath() + File.separator
+ "IMG_Some_name.jpg";
CameraActivity.this.sendBroadcast(new Intent(
Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri
.parse("file://" + path)));
それが役に立てば幸い。
画像を保存してから使用してください
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));
MyMediaConnectorClientの私のコード:
public class MyMediaConnectorClient implements MediaScannerConnectionClient {
String _fisier;
MediaScannerConnection MEDIA_SCANNER_CONNECTION;
public MyMediaConnectorClient(String nume) {
_fisier = nume;
}
public void setScanner(MediaScannerConnection msc){
MEDIA_SCANNER_CONNECTION = msc;
}
@Override
public void onMediaScannerConnected() {
MEDIA_SCANNER_CONNECTION.scanFile(_fisier, null);
}
@Override
public void onScanCompleted(String path, Uri uri) {
if(path.equals(_fisier))
MEDIA_SCANNER_CONNECTION.disconnect();
}
}
Galleryアプリに権限を与える必要があります。ホーム画面のギャラリーアプリアイコンを長押しして、画面上部にポップアップ表示される[アプリ情報]をタップします。これを行うと、ギャラリーアプリの設定が表示されます。次に、[権限]タブに移動して、ストレージとカメラの権限を切り替えて有効にします。次に、ネイティブギャラリーアプリに移動すると、保存した画像を取得できます。
これにより、ギャラリー内の画像が表示されず、中央に404タイプのビットマップが表示される場合も、問題が解決されます。ギャラリーに画像を表示するにはいくつかのメタデータが必要なため、コードに含まれているタグを画像に追加してください。
String resultPath = getExternalFilesDir(Environment.DIRECTORY_PICTURES)+
getString(R.string.directory) + System.currentTimeMillis() + ".jpg";
new File(resultPath).getParentFile().mkdir();
try {
OutputStream fileOutputStream = new FileOutputStream(resultPath);
savedBitmap.compress(CompressFormat.JPEG, 100, fileOutputStream);
fileOutputStream.flush();
fileOutputStream.close();
} catch (IOException e2) {
e2.printStackTrace();
}
savedBitmap.recycle();
File file = new File(resultPath);
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.TITLE, "Photo");
values.put(MediaStore.Images.Media.DESCRIPTION, "Edited");
values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
values.put(MediaStore.Images.Media.DATE_TAKEN, System.currentTimeMillis ());
values.put(MediaStore.Images.Media.DATE_ADDED, System.currentTimeMillis());
values.put(MediaStore.Images.ImageColumns.BUCKET_ID, file.toString().toLowerCase(Locale.US).hashCode());
values.put(MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME, file.getName().toLowerCase(Locale.US));
values.put("_data", resultPath);
ContentResolver cr = getContentResolver();
cr.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
return resultPath;
これを試してみてください。作成された新しい画像についてブロードキャストするので、画像が表示されます。ギャラリーの中。 photoFileは、新しく作成されたイメージの実際のファイルパスに置き換えます
private void galleryAddPicBroadCast() {
Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
Uri contentUri = Uri.fromFile(photoFile);
mediaScanIntent.setData(contentUri);
this.sendBroadcast(mediaScanIntent);
}