1. 程式人生 > >Android從本地獲取照片以及呼叫手機拍照功能的方法

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程式碼

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);
    }
}
在Activity程式碼的onCreate()函式中加入了以下幾行:
        // 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()

錯誤資訊如下圖所示:



這個錯誤修改參考的是如下連結:http://blog.csdn.net/qq_23179075/article/details/70314473

這樣,複製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的作者比較腦殘。既然沒有做出直接能拿當前圖片座標的方法。那應該也沒有想過會記錄圖片的變化吧。。可是後來我發現我錯了。。。。寫這段程式的人就是個學數學的購幣。。。。。。

AndroidInternet獲取圖片並儲存到快取

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()方法,但是這樣進入頁面的時候焦點會自動消