Android從本地獲取照片以及呼叫手機拍照功能的方法
本文主要介紹的是從手機中獲取照片並且壓縮後顯示在imageview或者呼叫手機相機拍照之後壓縮顯示在imageView中,具有很好的參考意義,同時兼顧了Android7.0對於呼叫手機相機的設定問題。有需要的可以借鑑一下:
1.XML佈局檔案程式碼
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <ImageView android:id="@+id/imageView" android:adjustViewBounds="true" android:layout_gravity="center" android:minWidth="150dip" android:minHeight="150dip" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <Button android:id="@+id/btnPhone" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="相簿" /> <Button android:id="@+id/btnTakePicture" android:layout_height="wrap_content" android:layout_width="fill_parent" android:text="拍照" /> </LinearLayout>
2.Activity程式碼
在Activity程式碼的onCreate()函式中加入了以下幾行:package com.apress.gerber.camera; import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.os.StrictMode; import android.provider.MediaStore; import android.view.View; import android.widget.Button; import android.widget.ImageView; import java.io.ByteArrayOutputStream; import java.io.File; public class MainActivity extends Activity { private static final int NONE = 0; private static final int PHOTO_GRAPH = 1;// 拍照 private static final int PHOTO_ZOOM = 2; // 縮放 private static final int PHOTO_RESOULT = 3;// 結果 private static final String IMAGE_UNSPECIFIED = "image/*"; private ImageView imageView = null; private Button btnPhone = null; private Button btnTakePicture = null; private String change_path = "/peoplechanged"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); imageView = (ImageView) findViewById(R.id.imageView); btnPhone = (Button) findViewById(R.id.btnPhone); btnPhone.setOnClickListener(onClickListener); btnTakePicture = (Button) findViewById(R.id.btnTakePicture); btnTakePicture.setOnClickListener(onClickListener); StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder(); StrictMode.setVmPolicy(builder.build()); builder.detectFileUriExposure(); } private final View.OnClickListener onClickListener = new View.OnClickListener() { @Override public void onClick(View v) { if(v==btnPhone){ //從相簿獲取圖片 Intent intent = new Intent(Intent.ACTION_PICK, null); intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, IMAGE_UNSPECIFIED); startActivityForResult(intent, PHOTO_ZOOM); }else if(v==btnTakePicture){ //從拍照獲取圖片 String filePath = Environment.getExternalStorageDirectory()+change_path; File localFile = new File(filePath); if (!localFile.exists()) { localFile.mkdir(); } Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Environment.getExternalStorageDirectory()+change_path ,"temp.jpg"))); startActivityForResult(intent, PHOTO_GRAPH); } } }; @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == NONE) return; // 拍照 if (requestCode == PHOTO_GRAPH) { // 設定檔案儲存路徑 String filePath = Environment.getExternalStorageDirectory()+change_path; File localFile = new File(filePath); if (!localFile.exists()) { localFile.mkdir(); } File picture = new File(Environment.getExternalStorageDirectory()+change_path + "/temp.jpg"); startPhotoZoom(Uri.fromFile(picture)); } if (data == null) return; // 讀取相簿縮放圖片 if (requestCode == PHOTO_ZOOM) { startPhotoZoom(data.getData()); } // 處理結果 if (requestCode == PHOTO_RESOULT) { Bundle extras = data.getExtras(); if (extras != null) { Bitmap photo = extras.getParcelable("data"); ByteArrayOutputStream stream = new ByteArrayOutputStream(); photo.compress(Bitmap.CompressFormat.JPEG, 75, stream);// (0-100)壓縮檔案 //此處可以把Bitmap儲存到sd卡中 imageView.setImageBitmap(photo); //把圖片顯示在ImageView控制元件上 } } super.onActivityResult(requestCode, resultCode, data); } /** * 收縮圖片 * * @param uri */ public void startPhotoZoom(Uri uri) { Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(uri, IMAGE_UNSPECIFIED); intent.putExtra("crop", "true"); // aspectX aspectY 是寬高的比例 intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); // outputX outputY 是裁剪圖片寬高 intent.putExtra("outputX", 300); intent.putExtra("outputY", 500); intent.putExtra("return-data", true); startActivityForResult(intent, PHOTO_RESOULT); } }
// android 7.0系統解決拍照的問題
StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
StrictMode.setVmPolicy(builder.build());
builder.detectFileUriExposure();
如果未加這幾行,同時手機是Android7.0的話,會提示報錯:
android.os.FileUriExposedException: file:///storage/emulated/0/photo.jpeg exposed beyond app through ClipData.Item.getUri()
錯誤資訊如下圖所示:
這樣,複製XML和Activity檔案即可執行,實現對手機圖片的獲取和相機的呼叫
相關推薦
Android從本地獲取照片以及呼叫手機拍照功能的方法
本文主要介紹的是從手機中獲取照片並且壓縮後顯示在imageview或者呼叫手機相機拍照之後壓縮顯示在imageView中,具有很好的參考意義,同時兼顧了Android7.0對於呼叫手機相機的設定問題。有需要的可以借鑑一下: 1.XML佈局檔案程式碼 <?xml ve
Xamarin.Android 呼叫手機拍照功能
/// <summary> /// 拍照結束執行 /// </summary> /// <param name="requestCode"></param> /// <par
HTML5+Canvas+jQuery呼叫手機拍照功能實現圖片上傳(二)
上一篇只講到前臺操作,這篇專門涉及到Java後臺處理,前臺通過Ajax提交將Base64編碼過的圖片資料資訊傳到Java後臺,然後Java這邊進行接收處理,通過對圖片資料資訊進行Base64解碼,之後使用流將圖片資料資訊上傳至伺服器進行儲存,並且將圖片的路徑地址存進資料庫。
Android從本地選擇檔案並判斷檔案型別並獲取選到檔案大小的方法
最近有一個android選擇本地檔案的並判斷檔案型別的需求 首先要選擇檔案通過點選事件進入到檔案列表 這裡是瀏覽所有的檔案。用到的是startActivityForResult Intent intent = new Intent(Intent.ACTION_GET_CO
Android從本地伺服器獲取Mp3實現邊下邊播(JavaEE+Tomcat+SQLServer)
實現環境: 1)Lenovo G50-80 Ubuntu16.04筆記本 2)Android Studio 3)Eclipse J2EE 4)Tomcat 8.5 5)sqlServer 6)jdk1.8概要設計基於Android平臺的MP
spring cloud config配置中心總結篇+從本地獲取配置檔案
1、配置中心就是一個spring boot專案 ,可以直接暴露url 讓其它微服務獲取配置,也可以註冊到eureka註冊中心,其它微服務從註冊中心獲取配置 2、配置中心可以從git、本地、svn獲取配置檔案 ,這三個地方的檔名字,採用{application}-{profile}.yml 或
Tensorflow學習第1課——從本地載入MNIST以及FashionMNIST資料
很多Tensorflow第一課的教程都是使用MNIST或者FashionMNIST資料集作為示例資料集,但是其給的例程基本都是從網路上用load_data函式直接載入,該函式封裝程度比較高,如果網路出現問題,資料集很難實時從網上下載(筆者就多次遇到這種問題,忍無可忍),而且資料是如何解碼的也一無所知,不利於後
小程式從伺服器獲取資料以及帶參傳資料 php
此前沒有摸索過小程式,原本打算看視訊教學慢慢走的,發現老師講的基本都是文件,於是乾脆直接實踐。 要實現這樣一個排行 官方文件上的東西我就不照搬了 var that = this; wx.request({ //請求介面的地址
android從伺服器獲取apk安裝
try { URL url = new URL(params[0]); HttpURLConnection connection = (HttpURLConnection) url.openConnection();
android 從檔案獲取視訊幀
轉自:https://blog.csdn.net/heart_Moving/article/details/17414067MediaDecoder.javaimport android.graphics.Bitmap; import android.media.MediaM
android 從相簿選取圖片在小米手機報錯的解決辦法
在跳轉到系統相簿選取照片的時候,用如下程式碼跳轉: Intent albumIntent = new Intent(Intent.ACTION_PICK, null); /** * 下面這句話,與其它方式寫
android 從matrix獲取處理過的圖片的實際寬度
很顯然的,這麼做費力不討好。效率不高。。。。。開始我以為這個坑爹的matrix的作者比較腦殘。既然沒有做出直接能拿當前圖片座標的方法。那應該也沒有想過會記錄圖片的變化吧。。可是後來我發現我錯了。。。。寫這段程式的人就是個學數學的購幣。。。。。。
Android從Internet獲取圖片並儲存到快取
public class MainActivity extends AppCompatActivity { private Button button; private File file; private String path; private Handler hand
Android——從本地相簿上傳圖片至伺服器
android實現本地圖片上傳至服務端,只需幾步操作即可實現,下面一起看看。 首先看下效果: 主要程式碼: package com.kevin.imageuploadclient.fragment; import android.graphics
android 從 service 獲取資料 到 activity
package com.websmithing.broadcasttest; import java.util.Date; import android.app.Service; import android.content.Intent; import android
Android 6.0 許可權使用 以及小米手機許可權的適配
Android Runtime Permission 1,執行時許可權說明: Android執行時許可權,是Android6.0新加的功能點。當我們想要把我們的app適配到6.0 以及以上的時候,我們需要對執行時許可權做些操作,否則很容易會造成程式崩潰
android從網路獲取圖片並顯示和儲存
如何不斷獲取圖片並顯示出來,達到視訊的效果。 程式碼: <span style="font-size:12px;">publicclass GetPictureFromInternetActivity extends Activity { p
Docker鏡像保存為文件及從本地文件導入鏡像的方法
docker 鏡像 容器1、概述我們制作好鏡像後,有時需要將鏡像復制到另一臺服務器使用。能達到以上目的有兩種方式,一種是上傳鏡像到倉庫中(本地或公共倉庫),但是另一臺服務器很肯能只是與當前服務器局域網想通而沒有公網的,所以如果使用倉庫的方式,只能自己搭建私有倉庫,這會在另一篇文章中介紹。如果我們僅僅是要復制到
Vue---從後臺獲取數據vue-resource的使用方法
獲取 root input lang url styles table 取數據 perl 作為前端人員,在開發過程中,我們大多數情況都需要從後臺請求數據,那麽在vue中怎樣從後臺獲取數據呢?接下來,我簡單介紹一下vue-resource的使用方法,希望對大家有幫助。 一
實現input移動端自動獲取焦點以及數字鍵盤搜尋功能
最近專案中需要做一個搜尋功能,其中就有自動獲取焦點以及數字鍵盤快捷搜尋,下面就跟大家分享一下我的實現方法:首先跳轉到搜尋頁面input自動獲取焦點,按常規寫法就是加個autofocus或者頁面載入完成後立即給input加個focus()方法,但是這樣進入頁面的時候焦點會自動消