十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
这是我学习Android时做的一个小程序,程序主要功能是实现一个迷你相册的功能,可以在虚拟机上看到很不错的效果。
创新互联公司专注于宝塔企业网站建设,响应式网站开发,商城网站定制开发。宝塔网站建设公司,为宝塔等地区提供建站服务。全流程按需制作,专业设计,全程项目跟踪,创新互联公司专业和态度为您提供的服务
我设置屏幕的大小为800*600
/*
*ImageSwitcherGallery.java
*/
package android.study_layout;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.view.Window;
import android.view.animation.AnimationUtils;
import android.widget.*;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ViewSwitcher.ViewFactory;
public class ImageSwitcherGallery extends Activity implements
OnItemSelectedListener, ViewFactory {
private ImageSwitcher image_switcher;
private Gallery gallery;
private Integer[] mThumbIds = { R.drawable.a1, R.drawable.a2,
R.drawable.a3, R.drawable.a4, R.drawable.a5,
};
private Integer[] mImageIds = { R.drawable.a1, R.drawable.a2,
R.drawable.a3, R.drawable.a4, R.drawable.a5, };
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.image_switcher_gallery);
image_switcher = (ImageSwitcher) findViewById(R.id.switcher);
image_switcher.setFactory(this);
image_switcher.setInAnimation(AnimationUtils.loadAnimation(this,
android.R.anim.fade_in));
image_switcher.setOutAnimation(AnimationUtils.loadAnimation(this,
android.R.anim.fade_out));
gallery = (Gallery) findViewById(R.id.gallery);
gallery.setAdapter(new ImageAdapter(this));
gallery.setOnItemSelectedListener(this);
}
@Override
public View makeView() {
ImageView image = new ImageView(this);
image.setBackgroundColor(0xFF000000);
image.setScaleType(ImageView.ScaleType.FIT_XY);
image.setLayoutParams(new ImageSwitcher.LayoutParams(
LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
return image;
}
public class ImageAdapter extends BaseAdapter {
public ImageAdapter(Context c) {
mContext = c;
}
public int getCount() {
return mThumbIds.length;
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
ImageView image = new ImageView(mContext);
image.setImageResource(mThumbIds[position]);
image.setAdjustViewBounds(true);
image.setLayoutParams(new Gallery.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
return image;
}
private Context mContext;
}
@Override
public void onItemSelected(AdapterView? parent, View view, int position,
long id) {
ImageSwitcher image_switcher = (ImageSwitcher) findViewById(R.id.switcher);
image_switcher.setImageResource(mImageIds[position]);
}
@Override
public void onNothingSelected(AdapterView? parent) {
}
}
xml文件
?xml version="1.0" encoding="utf-8"?
RelativeLayout
xmlns:android=""
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
ImageSwitcher
android:id="@+id/switcher"
android:layout_width="match_parent"
android:layout_height="450dip"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
/
Gallery
android:id="@+id/gallery"
android:layout_width="fill_parent"
android:layout_height="120dip"
android:background="#55000000"
android:layout_alignParentLeft="true"
android:layout_alignParentBottom="true"
android:gravity="center_vertical"
android:spacing="30dip"
/
/RelativeLayout
相册缺少权限。
如果在android11上还是用原有的路径,相册就没有操作和访问权限,所以后续存放文件位置需要更新。解决方法只需要代码写入把透明网络图替换为白色背景并显示,就可以进行公共相册保存。
还可以申请MANAGE最高的文件读取权限,通过操作我的选择,把Result进行回调,打开系统相册在打开系统裁剪生成本地File,通过存储的Uri获取File,就可以解决。
1.拍照 (对于7.0以上的版本,不在允许直接访问uri)
`
若不指定输出路径intent.putExtra(MediaStore.EXTRA_OUTPUT, getTempUri(srcActivity)); 在onActivityResult()中,通过
`
可以拿到uri,但获得的图片是被压缩过的。若指定intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);输出路径,则此处的intent为null,但可以使用我们存的uri读取照片,此时的照片没有被压缩。
2.从相册中读取照片, 方法:
`
`
即使设置 intent.putExtra(MediaStore.EXTRA_OUTPUT, getTempUri(srcActivity));输出路径,仍然不能从此路径中读取,只能在onActivityForResult()中通过event.uri = intent.getData();方式获得图片uri。
此种现象也好理解,拍照时产生新的图片,自然可根据设置的uri进行图片保存,而读取相册时,图片已经在目录中不能转移到自己设定的uri中。
Androidmanifest.xml中
`
在 res/xml/provider_paths.xml
`
?xml version="1.0" encoding="utf-8"?
paths
external-path name="JDTobs" path=""/
files-path name="name" path="path" /
cache-path name="name" path="path" / external-path name="name" path="path" /
external-files-path name="name" path="path" /
external-cache-path name="name" path="path" / /paths `
读取uri
最近一直被Android10相关的适配搞得焦头烂额,之前也听说过android10中的所有的视频,音频以及图片等资源为了统一的管理,统一放在一个共有的文件下,也就是所谓的沙箱。看了一下其他人写的文章,也提供了一种简单粗暴的方式也就是在清单文件application下配置#android:requestLegacyExternalStorage="true"#,但如果android11出来又得适配了,android11是禁止除了共有文件夹下新建视频,音频以及图片等文件。不然就会报找不到文件相关的错误,好了说到底我们还是得花点时间去适配android10以上的沙箱适配。
进入正题,接下来我们就来适配Android10相关的拍照以及选择相册并兼容android10以下的绝大部分的适配。
进入系统相册的操作都是一样的这里就不赘述:
主要的还是要对返回的data进行处理,也就是把uri转换成文件File的路径path
当然了拍照和位图Bitmap相关的适配是一样的。
7.0以上Android版本的路径配置
第一步
@xml/file_camera_paths 文件配置
拍照首先需要申请拍照权限
申请完后调用camera就可以拍照,拍照主要就是在调用相机的时需要自己去配置文件存储路径。
回调处理这里我就不赘述了 主要是对Android10以上关于图片配置相关的处理
既然关于Android 10那么我们也讲一下关于定位方面的适配,Android10以上需要在清淡文件中添加一个新的定位权限
就我个人所知道的安卓系统的话,它的所有照片都存储在一个叫做。DC im的一个文件夹里面。这个文件讲的话,你可以通过几种方式找到一般安卓手机的话,他都会有一个文件管理的图标。
你点击进去,以后。然后选择一个手机的选项,然后在内部存储里你就可以找到这个文件夹。
现在的安卓系统比较高级,他都会在后面备注一个相册的选项。然后最后在这个选项里面基本上所有的图片都在你的。这个文件夹里面包括你使用照相机照的图片,甚至是你的截图都是保存在这个文件夹里面的。
而且现在这个文件夹真的是比较人性化了。安卓系统人性化的方面就是你可以获得这方面的权限,可以直接的方便的查看而苹果手机不行就只有安卓手机可以。
主相册:DCIM,photo(s)看手机,只要不是这两个文件夹里都归为其他相册
下载个“文件管理”软件----图片分类----即可看到所有图片了!