我有一个扩展的 BaseAdapter,它的 LinearLayout 子项(每个子项中有一个 ImageView 和一个 TextView)连接到自定义图库。
当我第一次启动我的活动时,我想调用setSelection(position)使 ImageView 将其选择器更改为“选定”图像。一旦我在随后选定的孩子上扔画廊,这就会起作用,但不是第一次启动应用程序。
我的选择器:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true"
android:drawable="@drawable/home_image_select" />
<item android:state_selected="false"
android:drawable="@drawable/home_image" />
</selector>
Run Code Online (Sandbox Code Playgroud)
我的第一个猜测是在调用 setSelection() 之后在适配器上调用 notifyDataSetChanged(),我尝试这样做:
((CustomAdapter) gallery.getAdapter()).notifyDataSetChanged();
Run Code Online (Sandbox Code Playgroud)
那没有任何作用。我还尝试覆盖 Gallery 类的 setSelection() 来执行此操作:
View v = this.getAdapter().getView(position, null, this);
((ImageView) v.findViewById(R.id.gallery_image)).setSelected(true);
Run Code Online (Sandbox Code Playgroud)
那也行不通。有什么我想念的或可以尝试的吗?
我想创建一个左右滑动的照片库.起初我看了看Gallery,但它被标记为已弃用.
http://developer.android.com/reference/android/widget/Gallery.html
我们被告知要尝试ViewPager.但该PagerAdapter课程不处理我们的观点回收(如标准ListView),是吗?
http://developer.android.com/reference/android/support/v4/view/PagerAdapter.html
我们是否应该建立回收机制?
谢谢
我希望我的 Activity 可以接受 Gallery 的 jpg。所以我设置
Intent picker = new Intent (Intent.ACTION_PICK);
picker.setType ("image/jpeg");
Run Code Online (Sandbox Code Playgroud)
但画廊仍然显示所有格式的图像。我怎样才能让画廊只显示我需要的东西?是否需要自定义图库?
我需要一起滚动项目,所选项目应该向下扩展一部分.

我目前正在使用一个Gallery(我尝试使用viewflow和viewpager,但这些项目之间有很大的空间),但我需要知道如何才能实现此效果.
我有2个想法,但我不知道如何实现它.
1)可扩展部分是LinearLayout,其中visibility = gone,当选择该项时,此布局应该是可见的.(图库没有"onItemSelectedListener")
2)将每个元素视为一个片段(一旦我使用一个使用它的Viewpager, https://github.com/mrleolink/SimpleInfiniteCarousel)
它不一定是画廊,任何想法都是受欢迎的
我正在开展一项活动.
在使用 Android 文件系统时,我可能注意到一个我无法真正向自己解释的问题。使用File.renameTo()or更改图像File.delete()(无论图像是否有任何Exif数据)会产生以下结果(上面提到的方法返回true):
File.renameTo():图库仍然通过详细信息显示旧名称,并且下面发布的方法也返回一个空缩略图(当然,因为路径指向应该删除的文件)File.delete():图像已从文件系统中消失(许多经过测试的文件浏览器都不再显示它并new File(pathToDeletedImage).exists()返回false),但图库仍然显示该图像,包括。所有细节问题:我是否需要以某种方式通知图库有关我刚刚对图像文件执行的更改?
我用来获取缩略图的方法:
private Bitmap getThumbnail(ContentResolver cr, String path)
throws Exception {
Cursor ca = cr.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
new String[] { MediaStore.MediaColumns._ID },
MediaStore.MediaColumns.DATA + "=?", new String[] { path },
null);
if (ca != null && ca.moveToFirst()) {
int id = ca.getInt(ca.getColumnIndex(MediaStore.MediaColumns._ID));
ca.close();
return MediaStore.Images.Thumbnails.getThumbnail(cr, id,
MediaStore.Images.Thumbnails.MICRO_KIND, null);
}
ca.close();
return null;
}
Run Code Online (Sandbox Code Playgroud)
更新
好吧,我发现我们需要将所有文件更改与文件系统同步。我的猜测是,类似File.delete()和 的操作File.renameTo()在 Linux 级别上工作,但上面也有 …
我有一个相机应用程序,在用户拍摄图像后,我将其保存到我创建的目录中的内部存储中。一切正常,图像保存在那里,我可以加载它并在之后显示,但我也无法将图像保存到 Android 画廊。
我想要的是将图像保存到内部目录后,将其复制到图库。
我试过这个:
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.DATE_TAKEN, System.currentTimeMillis());
values.put(MediaStore.Images.Media.MIME_TYPE, "image/png");
values.put(MediaStore.Images.Media.SIZE, file.length());
values.put(MediaStore.Images.Media.DATA, file.getAbsolutePath());
context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
Run Code Online (Sandbox Code Playgroud)
文件是我保存在内部存储中的图像。使用这种方法,我得到的只是图库中的损坏图像。
我使用以下代码从图库中选择图片或视频:
imgGallery.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent pickPhoto = new Intent(Intent.ACTION_GET_CONTENT);
pickPhoto.setType("*/*");
String[] mimetypes = {"image/*", "video/*"};
pickPhoto.putExtra(Intent.EXTRA_MIME_TYPES, mimetypes);
startActivityForResult(pickPhoto,
SELECT_PICTURE_OR_VIDEO);
}
});
Run Code Online (Sandbox Code Playgroud)
请注意我使用相同的按钮进行图像或视频选择.因此,当调用onActivityResult时,有什么方法可以让我知道选择了图像或从图库中选择了视频?
我想打开具有多个图像选择功能的图库,我正在使用以下代码。
Intent intent = new Intent();
intent.setType("image/*");
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent,"Select Picture"), 1);
Run Code Online (Sandbox Code Playgroud)
它打开图库应用程序,但不允许我选择多个图像。
对于我的应用程序,图像存储在我手机的内部存储器中,图像在图库中可见,但我的客户希望图像在图库中不可见。
我在存储图像的文件夹中手动添加了 .nomedia 文件,它消失了,但我再次拍摄了新图像,它在图库中可见。
那么我该如何以编程方式做到这一点,以便图像不会出现在我的画廊中呢?
这是我的代码。
public void onActivityResult(int requestCode, int resultCode, Intent data){
super.onActivityResult(requestCode, resultCode,data);
if(resultCode== Activity.RESULT_OK){
if(requestCode==REQUEST_CAMERA){
Uri selectedImageUri = data.getData();
if (null != selectedImageUri) {
// Get the path from the Uri
String path = getPathFromURI(selectedImageUri);
File file = new File(path);
Bitmap bmp = CommonMethod.compressImage(file, getContext());
Log.e(TAG, "onActivityResult --: "+ String.format("Size : %s", getReadableFileSize(file.length())));
mCustomerImage = CommonMethod.bitmapToByteArray(bmp);
imageTemplateStr = Base64.encodeToString(mCustomerImage, Base64.DEFAULT);
Log.e(TAG, "image: "+ imageTemplateStr );
imageCustomer.setImageBitmap(bmp);
}
}else if(requestCode==SELECT_FILE){
Uri selectedImageUri = data.getData();
if (null != …Run Code Online (Sandbox Code Playgroud) 我的目标是从相机应用程序请求图片,将其保存在我的应用程序数据中,并将相同的图片写入图库,因此如果用户删除应用程序,它仍然保留拍摄的照片(与信使不同,我们的实用工具图片即使没有应用程序)。
我面临的问题与 29 API 级别女巫密切相关是构建目标(提供降级是不可接受的)。
所以基本上我得到的是:
第一个问题:即使Manifest.permission.WRITE_EXTERNAL_STORAGE授予我也无法访问使用Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)我得到 IOException构造的文件(权限被拒绝)
第二个问题:contentResolver.insert(contentUri, contentValues)在预 Q 设备(诺基亚 8 Android Pie)上抛出这个:
java.lang.SecurityException: Permission Denial: writing com.android.providers.media.MediaProvider uri content://media/external/images/media from .... requires android.permission.WRITE_EXTERNAL_STORAGE, or grantUriPermission()
Run Code Online (Sandbox Code Playgroud)
如果我在 Android 10 设备(在我的情况下为模拟器)上运行,则使用选项可以contentResolver.insert(..)正常工作。
主要问题是如何在定位 29Api 级别时将图片正确写入 android 管理的图库文件夹,以便它可以在 android 10 之前的设备上使用?
额外参考
我用于将图片从我的应用缓存存储写入 android 10 画廊的代码是:
fun writePictureToGalleryQ(context: Context, pictureUri: Uri, pictureName: String) {
val contentResolver = context.contentResolver
val relativeLocation = "${Environment.DIRECTORY_PICTURES}${File.separator}WaiJuDuDisAndroid"
val contentValues = ContentValues().apply {
put(MediaStore.Images.ImageColumns.DISPLAY_NAME, pictureName)
put(MediaStore.MediaColumns.MIME_TYPE, …Run Code Online (Sandbox Code Playgroud) android ×10
android-gallery ×10
java ×2
android-file ×1
filesystems ×1
intentfilter ×1
media ×1
mime-types ×1