Java 媒体扫描程序正在扫描,但未刷新(Android)
我有一个画廊应用程序,也有相机功能。拍摄完照片后,“我的活动”结果要求媒体扫描仪扫描文件。虽然它会扫描文件,LogCat会报告文件的确切位置,并将其保存在指定的目录中,但my gallery和Google Photos等其他工具直到下次重新启动或很长时间后才会显示图像。我做错了什么Java 媒体扫描程序正在扫描,但未刷新(Android),java,android,android-intent,camera,android-camera,Java,Android,Android Intent,Camera,Android Camera,我有一个画廊应用程序,也有相机功能。拍摄完照片后,“我的活动”结果要求媒体扫描仪扫描文件。虽然它会扫描文件,LogCat会报告文件的确切位置,并将其保存在指定的目录中,但my gallery和Google Photos等其他工具直到下次重新启动或很长时间后才会显示图像。我做错了什么 protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == SETTINGS_REQUEST && resultCode == Activity.RESULT_OK) {
MediaFragment content = (MediaFragment) getFragmentManager().findFragmentById(com.marlonjones.aperture.R.id.content_frame);
if (content != null) content.reload();
reloadNavDrawerAlbums();
}
if (requestCode == NEW_PICTURE) {
if (resultCode == Activity.RESULT_OK) {
Uri uri = null;
if (data != null) {
uri = data.getData();
}
if (uri == null && mCameraFileName != null) {
uri = Uri.fromFile(new File(mCameraFileName));
}
Date date = new Date();
DateFormat df = new SimpleDateFormat("-mm-ss");
String newPicFile = "PH" + df.format(date) + ".jpg";
String outPath = "/sdcard/Aperture/" + newPicFile;
MediaScannerConnection.scanFile(this,
new String[]{Uri.fromFile(new File (outPath)).toString()}, null,
new MediaScannerConnection.OnScanCompletedListener() {
@Override
public void onScanCompleted(String path, Uri uri) {
Log.i("ExternalStorage", "Scanned " + path + ":");
Log.i("ExternalStorage", "-> uri=" + uri);
}
});
}
}
}
public void camera(MenuItem menu) {
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
int hasCameraPermission = checkSelfPermission(Manifest.permission.CAMERA);
if (hasCameraPermission != PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{Manifest.permission.CAMERA},
REQUEST_CODE_ASK_PERMISSIONS);
return;
}
Intent intent = new Intent();
intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
Date date = new Date();
DateFormat df = new SimpleDateFormat("-mm-ss");
String newPicFile = "PH" + df.format(date) + ".jpg";
String outPath = "/sdcard/Aperture/" + newPicFile;
File outFile = new File(outPath);
mCameraFileName = outFile.toString();
Uri outuri = Uri.fromFile(outFile);
intent.putExtra(MediaStore.EXTRA_OUTPUT, outuri);
startActivityForResult(intent, NEW_PICTURE);
}
else {
Intent intent = new Intent();
intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
Date date = new Date();
DateFormat df = new SimpleDateFormat("-mm-ss");
String newPicFile = "PH" + df.format(date) + ".jpg";
String outPath = "/sdcard/Aperture/" + newPicFile;
File outFile = new File(outPath);
mCameraFileName = outFile.toString();
Uri outuri = Uri.fromFile(outFile);
intent.putExtra(MediaStore.EXTRA_OUTPUT, outuri);
startActivityForResult(intent, NEW_PICTURE);
}
}}
从不硬编码路径。当与辅助帐户一起使用时,数亿台Android设备的代码不正确。使用方法获取文件系统位置。在您的情况下,请更换:
String outPath = "/sdcard/Aperture/" + newPicFile;
与:
其次,scanFile()。替换:
new String[]{Uri.fromFile(new File (outPath)).toString()}
与:
我的相机也使用/SD卡/光圈。它省钱了,但我也应该换掉它吗?@VirusThePanda:是的,出于同样的原因。在Android 4.2+平板电脑和Android 5.0+手机上,可以有多个用户帐户。每个用户都有自己的外部存储位置,它们的路径也会有所不同。好的,在我的相机意图中,我使用了:tring outPath=“/Environment.getExternalStorageDirectory()/Aperture/”+newPicFile代码>这是否正确?或者应该与您的答案完全相同?现在根本没有创建文件。你能帮忙吗?我已将代码还原为原始状态,以便您可以看到它。这是摄像机的意图。(查看问题。编辑)@VirusThePanda:好吧,如果你使用相同的文件名,你会有更好的运气<代码>新日期()
在不同的时间点会不同,因此基于新日期()
的文件名在不同的时间点会不同。您可以设置mCameraFileName
,然后在调用scanFile()
时忽略它。
new String[]{Uri.fromFile(new File (outPath)).toString()}
new String[]{picFile.getAbsolutePath()}