網站首頁 編程語言 正文
1、前期準備
需要在Manifest中添加相關權限
<uses-permission android:name="android.permission.CAMERA" /> <uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera.autofocus" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
2、主要方法
1、需要使用Intent調用攝像頭
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);//調用Camera startActivityForResult(intent, Activity.RESULT_OK);//如果正常,則返回 Activity.RESULT_OK 本質為 int類型的1
2、需要檢查SD卡(外部存儲)狀態
Environment.MEDIA_MOUNTED
sd卡在手機上正常使用狀態
Environment.MEDIA_UNMOUNTED
用戶手工到手機設置中卸載sd卡之后的狀態
Environment.MEDIA_REMOVED
用戶手動卸載,然后將sd卡從手機取出之后的狀態
Environment.MEDIA_BAD_REMOVAL
用戶未到手機設置中手動卸載sd卡,直接撥出之后的狀態
Environment.MEDIA_SHARED
手機直接連接到電腦作為u盤使用之后的狀態
Environment.MEDIA_CHECKINGS
手機正在掃描sd卡過程中的狀態
在代碼中的判斷
String sdStatus = Environment.getExternalStorageState(); if(!sdStatus.equals(Environment.MEDIA_MOUNTED)){ System.out.println(" ------------- sd card is not avaiable ---------------"); return; }
3、獲取圖片及其壓縮圖片
String name = "photo.jpg";//定義圖片名稱 Bundle bundle = data.getExtras();//data為onActivityResult中的intent類型的參數 Bitmap bitmap = (Bitmap) bundle.get("data");//bitmap // File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/"); // file.mkdirs(); //創建文件夾 // String fileName = Environment.getExternalStorageDirectory().getAbsolutePath()+"/"+name; String fileName = "sdcard"+"/"+name;//初始化文件路徑 FileOutputStream fos =null;//初始化文件輸出流 try { // System.out.println(fileName); // 測試用,查看文件路徑 fos=new FileOutputStream(fileName); // 輸出文件到外部存儲 //今天第一次正視這個bitmap.compress()方法,它用來壓縮圖片大小。 /* 這個方法有三個參數: Bitmap.CompressFormat format 圖像的壓縮格式; int quality 圖像壓縮率,0-100。 0 壓縮100%,100意味著不壓縮; OutputStream stream 寫入壓縮數據的輸出流; public boolean compress(CompressFormat format, int quality, OutputStream stream) {} 返回值boolean類型 如果成功地把壓縮數據寫入輸出流,則返回true。 */ bitmap.compress(Bitmap.CompressFormat.JPEG,100,fos); } catch (FileNotFoundException e) { e.printStackTrace(); }finally { try { fos.flush(); //釋放輸出流 fos.close(); } catch (IOException e) { e.printStackTrace(); } }
3、案例展示
1、Layout
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_take_photo" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="take photo" android:id="@+id/takephoto" /> <ImageView android:layout_below="@+id/takephoto" android:layout_width="400dp" android:layout_height="400dp" android:id="@+id/picture" /> </RelativeLayout>
2、MainActivity
package icu.whatsblog.CameraCrop; import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; import android.os.Environment; import android.provider.MediaStore; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.ImageView; import androidx.appcompat.app.AppCompatActivity; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import lee.suk.cameracrop.R; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ((Button) findViewById(R.id.takephoto)).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent, 1); } }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == Activity.RESULT_OK){ String sdStatus = Environment.getExternalStorageState(); if(!sdStatus.equals(Environment.MEDIA_MOUNTED)){ System.out.println(" ------------- sd card is not avaiable ---------------"); return; } String name = "photo.jpg"; Bundle bundle = data.getExtras(); Bitmap bitmap = (Bitmap) bundle.get("data"); // File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/"); // file.mkdirs(); //創建文件夾 // String fileName = Environment.getExternalStorageDirectory().getAbsolutePath()+"/"+name; String fileName = "sdcard"+"/"+name; FileOutputStream fos =null; try { System.out.println(fileName); fos=new FileOutputStream(fileName); bitmap.compress(Bitmap.CompressFormat.JPEG,100,fos); } catch (FileNotFoundException e) { e.printStackTrace(); }finally { try { fos.flush(); fos.close(); } catch (IOException e) { e.printStackTrace(); } } ((ImageView) findViewById(R.id.picture)).setImageBitmap(bitmap); } } }
原文鏈接:https://blog.csdn.net/w_Eternal/article/details/122425400
相關推薦
- 2022-02-10 postgresql解決鎖表
- 2022-06-09 Python列表的索引與切片_python
- 2023-07-07 使用python sdk添加刪除阿里云pvc路由
- 2022-07-12 微信小程序布局框架初步了解(彈性容器)
- 2023-03-04 Qt利用tablewidget模擬手指實現滑動_C 語言
- 2022-06-07 Python接口自動化之文件上傳/下載接口詳解_python
- 2022-03-30 C語言代碼實現猜數字游戲_C 語言
- 2023-02-26 Linux截取某一段時間的日志問題_linux shell
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支