android拍照獲取圖片
『壹』 Android 使用系統相機拍照和讀取相冊照片
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
『貳』 一個關於android的問題,我通過下面的方法調用相機,可是怎麼可以在拍照結束後獲取照片的路徑呢
Android調用系統拍照的代碼:
創建Intent Intent openCameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
String imagePath = Environment.getExternalStorageDirectory() + "/image" ;
設置文件路徑 File file = new File(imagePath);
if(!file.exists()){
file.mkdirs(); }
設置URI,指定相冊拍照後保存圖片的路徑,Uri imageUri = Uri.fromFile(new File(imagePath, "image.jsp"));
openCameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(openCameraIntent, REQUEST_CODE_TAKING_PICTURES);
拍照完以後,文件就會保存在這個指定的目錄下了。Uri 里指定了相機拍照的路徑。
『叄』 Android 拍照獲取縮略圖以及完整圖片(適配androidN)
takePictureIntent.resolveActivity(getPackageManager()) != null
在官方文檔中有描述:startActivityForResult()方法受到調用resolveActivity()的條件的保護,該方法返回可處理該意圖的第一個活動組件,執行此檢查很重要,因為如果您使用沒有應用程序可以處理的意圖調用startActivityForResult(),則您的應用程序將崩潰。所以只要結果不為空,就可以安全的使用意圖,大概意思是檢測手機中有沒有相機。
另外一種檢測相機的方法是
required=true 表示要安裝該應用,手機必須有攝像頭該硬體。要不然不允許安裝
鴻洋的博客關於android7.0 以及 4.0 拍照封裝的處理(點擊跳轉)
類似介紹比較好的文章推薦-Android 調用系統相機拍照攻略(已適配Android N)
『肆』 android 調用系統照相機拍照後獲得圖片路徑
{privateUrimOutPutFileUri;
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ButtontakePiCButton=(Button)this.findViewById(R.id.button1);
takePiCButton.setOnClickListener(this);
}
@Override
publicvoidonClick(Viewv){
switch(v.getId()){
caseR.id.button1:
saveFullImage();
break;
default:
break;
}
}
privatevoidsaveFullImage(){
Intentintent=newIntent(MediaStore.ACTION_IMAGE_CAPTURE);
//文件夾aaaa
Stringpath=Environment.getExternalStorageDirectory().toString()+"/aaaa";
Filepath1=newFile(path);
if(!path1.exists()){
path1.mkdirs();
}
Filefile=newFile(path1,System.currentTimeMillis()+".jpg");
mOutPutFileUri=Uri.fromFile(file);
intent.putExtra(MediaStore.EXTRA_OUTPUT,mOutPutFileUri);
startActivityForResult(intent,1);
}
@Override
protectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){
super.onActivityResult(requestCode,resultCode,data);
if(requestCode==1){
UriimageUri=null;
if(data!=null){
if(data.hasExtra("data")){
Bitmapthunbnail=data.getParcelableExtra("data");
//處理縮略圖
}
}else{
//處理mOutPutFileUri中的完整圖像
}
}
}
}
『伍』 android系統如何調用自帶的相機相冊
LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="gallery"
android:text="獲取圖庫圖片" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="camera"
android:text="拍照獲取圖片" />
<ImageView
android:id="@+id/iv_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
//------------------我的MainActivity --------------也很簡單--------------------------
package tackpicture.bwie.com.tackpicture;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Toast;
import java.io.File;
public class MainActivity extends AppCompatActivity {
private ImageView iv_image;
private static final int PHOTO_REQUEST_CAREMA = 1;// 拍照
private static final int PHOTO_REQUEST_GALLERY = 2;// 從相冊中選擇
private static final int PHOTO_REQUEST_CUT = 3;// 結果
/* 頭像名稱 */
private static final String PHOTO_FILE_NAME = "temp_photo.jpg";
private File tempFile;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//找到控制項
iv_image = (ImageView) findViewById(R.id.iv_image);
}
//圖庫
public void camera(View view) {
// 激活系統圖庫,選擇一張圖片
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");
// 開啟一個帶有返回值的Activity,請求碼為PHOTO_REQUEST_GALLERY
startActivityForResult(intent, PHOTO_REQUEST_GALLERY);
}
//相機
public void gallery(View view) {
// 激活相機
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
// 判斷存儲卡是否可以用,可用進行存儲
if (hasSdcard()) {
tempFile = new File(Environment.getExternalStorageDirectory(), PHOTO_FILE_NAME);
// 從文件中創建uri
Uri uri = Uri.fromFile(tempFile);
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
}
// 開啟一個帶有返回值的Activity,請求碼為PHOTO_REQUEST_CAREMA
startActivityForResult(intent, PHOTO_REQUEST_CAREMA);
}
/*
* 剪切圖片
*/
private void crop(Uri uri) {
// 裁剪圖片意圖
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
intent.putExtra("crop", "true");
// 裁剪框的比例,1:1
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
// 裁剪後輸出圖片的尺寸大小
intent.putExtra("outputX", 250);
intent.putExtra("outputY", 250);
intent.putExtra("outputFormat", "JPEG");// 圖片格式
intent.putExtra("noFaceDetection", true);// 取消人臉識別
intent.putExtra("return-data", true);
// 開啟一個帶有返回值的Activity,請求碼為PHOTO_REQUEST_CUT
startActivityForResult(intent, PHOTO_REQUEST_CUT);
}
/*
* 判斷sdcard是否被掛載
*/
private boolean hasSdcard() {
if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
return true;
} else {
return false;
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == PHOTO_REQUEST_GALLERY) {
// 從相冊返回的數據
if (data != null) {
// 得到圖片的全路徑
Uri uri = data.getData();
crop(uri);
}
} else if (requestCode == PHOTO_REQUEST_CAREMA) {
// 從相機返回的數據
if (hasSdcard()) {
crop(Uri.fromFile(tempFile));
} else {
Toast.makeText(MainActivity.this, "未找到存儲卡,無法存儲照片!", 0).show();
}
} else if (requestCode == PHOTO_REQUEST_CUT) {
// 從剪切圖片返回的數據
if (data != null) {
Bitmap bitmap = data.getParcelableExtra("data");
this.iv_image.setImageBitmap(bitmap);
}
try {
// 將臨時文件刪除
tempFile.delete();
} catch (Exception e) {
e.printStackTrace();
}
}
super.onActivityResult(requestCode, resultCode, data);
}
}
『陸』 android開發 調用系統相機後onActivityResult如何獲取剛拍一張圖片的名稱
Intent intentFromCapture = new Intent( MediaStore.ACTION_IMAGE_CAPTURE);
// checkHasSdcard 自定義函數,判斷存儲卡是否可用
if (checkHasSdcard()) {
File file = new File(「/mnt/SDCard/temp/」);
if (!file.exists())
file.mkdirs();
// /mnt/SDCard/temp/tmp_image.jpg 這是拍照後保存的文件,也就是說要自定義拍照後的文件名
intentFromCapture.putExtra(MediaStore.EXTRA_OUTPUT,
Uri.fromFile(new File(「/mnt/SDCard/temp/」, "tmp_image.jpg")));
}
startActivityForResult(intentFromCapture, 11);
然後在 onActivityResult 里就可以對讀取該文件了。
『柒』 android 手機照相機拍照的照片,默認的保存路徑是什麼。
裝了SD卡的:
/sdcard/DCIM/camera
未裝SD卡的:
/stystm/DCIM/camera
一般安卓手機的相機功能都會有固定的存放路徑,這個位置默認為:/sdcard/DCIM/100Andro或者/sdcard/DCIM/Camera,這里的sdcard是指手機中的SD卡,在電腦中顯示的為可移動磁碟。
根據不同品牌安卓手機的後期開發,文件夾名稱可能不太一樣,但一般是在DCIM目錄文件夾里邊,當然也會有特別,例如在酷派手機中手機拍照的圖片是存放在根目錄中的Photo中。
首先,打開手機上的相機,點擊設置按鈕,裡面會有一個選擇存儲位置,一般默認是存儲在手機內存,可以進行修改,存到SD卡中。通過數據線連接到電腦後,一般是一個叫DCIM的文件。
(7)android拍照獲取圖片擴展閱讀:
手機攝像頭的技術:
「像素」指的是相機感測器上的最小感光單位,通常所說的「XXX萬像素」實際是指相機的解析度,其數值大小主要由相機感測器中的像素點(即最小感光單位)數量決定。
相機的像素能決定的是其所拍圖片的解析度,而圖片的解析度越高,只代表了圖片的尺寸越大,並不能說明圖片越清晰。
感測器
相機感測器主要分兩種,CCD和CMOS。同時代的CMOS比CCD的開口率要低很多(也就是相同面積下,感光晶元真正接收光的面積CCD會比較大)。富士等創新型cmos的出現,CCD因為成本高,成像上越來越沒優勢就被淘汰了。
CMOS感測器又分為背照式和堆棧式兩種,二者系出同門,技術最早都由索尼研發,索尼背照式感測器品牌名為「ExmorR」,堆棧式感測器為「ExmorRS」。
相對來說,感測器尺寸越大,感光性能越好,捕捉的光子(圖形信號)越多,信噪比越高,成像效果自然也越出色,然而更大的感測器卻會導致手機的體積、重量、成本增加。
『捌』 Android gif相機開發 如何得到一幀幀的圖片,謝謝!!
1方法對不同的手機適用性不同,因為有的手機是不允許這樣調用的,有的還有防偷拍的,很難做到連拍;
2方法不明覺厲,感覺挺有可行性的;
3方法個人覺得不可行,因為截屏需root,要重寫系統功能。
『玖』 Android拍照、從圖庫導入以及圖片裁剪
以前在實際項目中使用拍照和從圖庫中獲取圖片時,不知道以何種方式從回調中取得圖片資源,以Bitmap方式還是Uri的形式?如果是使用Bitmap,應該注意些什麼,Uri又是一種什麼樣的格式?有時會出現拍照時回調data數據為空的情況,又該如何定位問題呢?圖片裁剪又是怎樣決定方案的?以下將針對這幾個問題闡述自己的見解。
在Android中,Intent觸發 Camera程序,拍好照片後會返回數據,比如攝像頭800萬像素,拍出來的圖片尺寸為 3200x2400,占據內存大小=3200 x 2400 x 4bytes / (1024 x 1024) = 30MB 【圖像設置ARGB_8888一個像素點占據4位元組內存】,這個尺寸對應的 Bitmap會耗光應用程序的內存,出於安全方面的考慮,Android會給你一個縮略圖,比如 160 x 120 px。
Q:為何要返回圖縮略?
縮略圖是指從onActivityForResullt回調方法中 intent保存的參數圖片。這是因為在啟動相機程序拍攝圖片,為了讓Bitmap數據能在Activity之間傳遞,不得不將拍攝後的Bitmap進行壓縮再傳遞,因此通過回調從intent中取得的是縮略圖在於拍攝的Bitmap太大,Activity之間Bundle存放的數據不能太大,會導致程序無響應。高清原圖是指直接將拍攝的圖片以文件/Uri形式保存到手機。
註:Bitmap實現了Parcelable 介面,所有可以在Activity間使用Intent傳遞。
Q:使用Bitmap需要注意哪些問題?
1、Android 裁剪圖片 Intent 附加數據的含義
| setExtra | DataType | Desciption | Extra |
|:-------- |:--------:| :------: |
|crop| String | Signals the crop feature | value="true" |
|aspectX|int|Aspect Ratio|裁剪橫向比例|
|aspectY|int|Aspect Ratio|裁剪縱向比例|
|outputX|int|width od output created from this intent|輸出寬度|
|outputY|int|height od output created from this intent|輸出高度|
|scale|boolean|should it scale|是否伸縮|
|return-date|boolean|Return the bitmap with Action-inline-data by using the data|是否返回Bitmap數據|
|data|Parcelable|Bitmap to process, you may provide it a bitmap (not tested)|可設置data為Bitmap或者將相應數據同uri聯系起來|
|circleCrop|String|if this string is not null, it will provide some cicular cr||
|MediaStore.
EXTRA_OUTPUT("output")|URI|set this URI to a File|輸出路徑到uri中|
2、圖片裁剪終極方案 — 圖片來源有拍照和圖庫,可採取的操作有:
3、剪切圖片: