Android设置拍照或者上传本地图片的示例
在Android应用开发中,用户可能需要上传图片,无论是从设备相册中选择还是直接通过摄像头拍摄。本示例将详细讲解如何实现这一功能,包括选择图片、拍照、本地缓存和图片压缩等关键步骤。 为了允许用户选择图片或拍照,你需要在主界面(Fragment或Activity)中设置一个点击事件监听器。例如,你可以创建一个ImageView,并在点击时启动一个新Activity,如`PopupActivity`。在监听器中,通过`startActivityForResult()`方法启动新的Activity,以便在用户完成操作后返回结果。 ```java // 主Fragment或Activity中的代码 mPic1 = (ImageView) view.findViewById(R.id.ImageView01); mPic1.setOnClickListener(mPhotoListener); private View.OnClickListener mPhotoListener = new View.OnClickListener() { @Override public void onClick(View v) { int id = v.getId(); if (id == R.id.ImageView01) { Intent popupIntent = new Intent(getActivity(), PopupActivity.class); mPhotoId = id; startActivityForResult(popupIntent, 1); } } }; ``` 接下来,我们进入`PopupActivity`,在这个Activity中,你需要提供两种选项:选择图片和拍照。这可以通过`Intent`实现,调用`ACTION_PICK`来打开图库,调用`ACTION_IMAGE_CAPTURE`来启动相机应用。 ```java // PopupActivity.java public void showImageOptions() { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("选择图片来源"); builder.setItems(new String[]{"相册", "拍照"}, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { if (which == 0) { // 从相册选择 Intent galleryIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(galleryIntent, GALLERY_REQUEST_CODE); } else if (which == 1) { // 使用相机 Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(cameraIntent, CAMERA_REQUEST_CODE); } } }); builder.show(); } ``` 当用户选择图片或拍照后,`onActivityResult()`会被调用。在这里,你可以获取到选中的图片Uri并进行处理,比如显示在ImageView上,或者开始上传过程。 ```java @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK) { if (requestCode == GALLERY_REQUEST_CODE) { // 从相册选择图片 Uri selectedImage = data.getData(); // 处理并显示图片 } else if (requestCode == CAMERA_REQUEST_CODE) { // 拍照 Bundle extras = data.getExtras(); Bitmap imageBitmap = (Bitmap) extras.get("data"); // 处理并显示图片 } } } ``` 关于本地缓存,你可以选择在图片上传后将其保存在本地,以便下次加载时直接从本地读取,而不需要再次从服务器请求。这可以通过将图片保存到SD卡或应用私有目录来实现。 ```java private void saveImageToLocal(Bitmap bitmap, String fileName) { File cacheDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); File outputFile = new File(cacheDir, fileName); FileOutputStream outStream; try { outStream = new FileOutputStream(outputFile); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outStream); outStream.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } ``` 至于图片压缩,由于网络传输速度和存储空间的考虑,通常需要对图片进行压缩。可以使用Bitmap的`compress()`方法,根据需要调整压缩质量。 ```java private Bitmap compressImage(Bitmap bitmap) { int quality = 80; // 压缩质量 ByteArrayOutputStream baos = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG, quality, baos); while (baos.toByteArray().length / 1024 > 100) { // 100KB为目标大小 baos.reset(); quality -= 10; bitmap.compress(Bitmap.CompressFormat.JPEG, quality, baos); } return BitmapFactory.decodeByteArray(baos.toByteArray(), 0, baos.toByteArray()); } ``` 上传图片至服务器通常需要使用HTTP请求,例如使用`HttpURLConnection`。以下是一个简单的上传示例: ```java private void uploadImage(Bitmap bitmap, String fileName) { URL url = new URL("http://yourserver.com/upload"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setDoOutput(true); conn.setRequestMethod("POST"); try (DataOutputStream dos = new DataOutputStream(conn.getOutputStream())) { bitmap.compress(Bitmap.CompressFormat.JPEG, 100, dos); dos.flush(); } catch (IOException e) { e.printStackTrace(); } int responseCode = conn.getResponseCode(); if (responseCode == HttpURLConnection.HTTP_OK) { // 上传成功 } else { // 上传失败 } } ``` 以上就是Android设置拍照或上传本地图片的基本实现过程,包括选择图片、拍照、本地缓存和图片压缩等功能。在实际应用中,还需要考虑错误处理、权限管理、进度显示等问题,以提供更好的用户体验。














- 粉丝: 3
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 6贝叶斯信念网络.pptx
- 企业信息化建设.pptx
- 【优质】室内平面图制作软件-word范文(6页).pdf
- 通信原理第章习题(1).ppt
- 互联网+时代初中教师信息素养培育策略.docx
- EPC总承包项目管理手册(New).doc
- 软件开发过程记录表.doc
- 计算机网络试题及答案.doc
- 四层电梯PLC控制系统设计.doc
- 物联网控制基础课程教学改革的探索与实践.docx
- 2017最新电大统考计算机小抄1选择题.doc
- 2023年操作系统上机实验报告.doc
- AutoCAD室内施工图课程标准.doc
- 城区县乡村三级农村物流网络体系建设规划方案.docx
- 2022通信工作计划_.docx
- 医疗器械软件申报的关键点幻灯片课件.ppt



评论0