1. 程式人生 > >關於安卓呼叫相機有關知識(含6.0新增許可權使用)

關於安卓呼叫相機有關知識(含6.0新增許可權使用)

一、呼叫系統相機拍照

拍照和相簿的功能在實際開發中是最常見的功能,這裡記錄下。

準備工作

許可權

<!-- 往SDCard寫入資料許可權 --> 
<uses-permission android:name="android.permission.
WRITE_EXTERNAL_STORAGE" /> 
<!--請求訪問使用照相裝置-->
<uses-permission android:name="android.permission.CAMERA" />

常量

public final static
int ALBUM_REQUEST_CODE = 1;
public final static int CROP_REQUEST = 2;
public final static int CAMERA_REQUEST_CODE = 3;
// 拍照路徑
public static String SAVED_IMAGE_DIR_PATH = Environment.getExternalStorageDirectory().getPath() + "/AppName/camera/";String cameraPath;
相機
    // 指定相機拍攝照片儲存地址
   String state = Environment.getExternalStorageState();
   if
(state.equals(Environment.MEDIA_MOUNTED)) {    cameraPath = SAVED_IMAGE_DIR_PATH +   System.currentTimeMillis() + ".png";    Intent intent = new Intent();    
   // 指定開啟系統相機的Action    intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);    String out_file_path = SAVED_IMAGE_DIR_PATH;    File dir = new
File(out_file_path);    if (!dir.exists()) {        dir.mkdirs();    }    // 把檔案地址轉換成Uri格式    Uri uri = Uri.fromFile(new File(cameraPath));    
   // 設定系統相機拍攝照片完成後圖片檔案的存放地址    intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);    startActivityForResult(intent, CAMERA_REQUEST_CODE); } else {    Toast.makeText(getApplicationContext(), "請確認已經插入SD卡",            Toast.LENGTH_LONG).show(); }

onActivityResult

拿到cameraPath,就隨便你搞了。

@Override

public void onActivityResult(int requestCode,
int resultCode, Intent data)
{    
super.onActivityResult(requestCode, resultCode, data);    
if (resultCode == Activity.RESULT_OK) {        
if (requestCode == CAMERA_REQUEST_CODE) {            LogUtil.d("path=" + cameraPath);        } }
相簿
Intent intent = new Intent(Intent.ACTION_PICK, null);
intent.setDataAndType(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(intent, ALBUM_REQUEST_CODE);

onActivityResult

呼叫系統相簿,然後通過Uri拿到圖片的絕對地址。

 @Override
 public void onActivityResult(int requestCode,
   int resultCode, Intent data)
{      
super.onActivityResult(requestCode, resultCode, data);    
if (resultCode == Activity.RESULT_OK) {          
if (requestCode == AppConstants.ALBUM_REQUEST_CODE) {               
try {      
Uri uri = data.getData();                    
final String absolutePath=
getAbsolutePath(mActivity, uri);    
ogUtil.d("path=" + absolutePath);      
         } catch (Exception e) {                    e.printStackTrace();          
         }            }        }    }

getAbsolutePath方法

 public String getAbsolutePath(final Context context, 
           final Uri uri)
{
     if (null == uri) return null;
          final String scheme = uri.getScheme();     String data = null;
           if (scheme == null)         data = uri.getPath();
           else if (ContentResolver.SCHEME_FILE.equals(scheme)) {         data = uri.getPath();     } else if (ContentResolver.SCHEME_CONTENT.equals(scheme)) {         Cursor cursor = context.getContentResolver().query(uri,         new String[]{MediaStore.Images.ImageColumns.DATA},
            null, null, null);
         if (null != cursor) {            
            if (cursor.moveToFirst()) {                
             int index = cursor.getColumnIndex(
             MediaStore.Images.ImageColumns.DATA);                
              if (index > -1) {               data = cursor.getString(index);                 }             }             cursor.close();         }     }     return data; }

二、呼叫第三方相機進行拍照

1、需要新增呼叫相機和外部儲存的許可權

  1. <spanstyle="font-size:14px;"><uses-permissionandroid:name="android.permission.CAMERA"/>
  2. <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/></span>

需要注意的是安卓6.0後使用相機等涉及隱私的許可權需要在程式碼內在申明,可通過以下方法:

  1. <span style="font-size:14px;">if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {  
  2.             requestPermissions(new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}, CAMERA_JAVA_REQUEST_CODE);  
  3.         }</span>  

2、使用Intent啟動第三方相機

可以通過startActivityForResult獲取到拍完照片的結果資訊。

  1. Intent intent = new Intent();  
  2. intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);  
  3. intent.putExtra(MediaStore.EXTRA_OUTPUT, getUri());  
  4. startActivityForResult(intent, CAMERA_REQUEST_CODE);  
其中需要的到給定一個圖片儲存的Uri
  1. private Uri getUri() {  
  2.         return Uri.fromFile(getFile());  
  3.     }  
  4.     /** 
  5.      * 該方法用於獲取指定路徑 和 名字 的file 
  6.      * @return 
  7.      */
  8.     private File getFile() {  
  9.         File filePath = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM), "CameraDemo");  
  10.         if (!filePath.exists()) {  
  11.             filePath.mkdirs();  
  12.         }  
  13.         //將圖片儲存的名字設定為當前拍照的時間
  14.         SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");  
  15.         String name = format.format(new Date());  
  16.         File file = new File(filePath.getPath() + File.separator + name + ".jpg");  
  17.         return file;  
  18.     }  
3、重寫onActivityResult獲取拍照後返回的資訊
  1. @Override
  2.     protectedvoid onActivityResult(int requestCode, int resultCode, Intent data) {  
  3.         super.onActivityResult(requestCode, resultCode, data);  
  4.         if (requestCode == CAMERA_REQUEST_CODE) {  
  5.             if (resultCode == RESULT_OK) {  
  6.                 Log.d("print""拍照成功");  
  7.             }  
  8.         }  
  9.     }  

二、使用camera進行拍照

1、需要藉助SurfaceView來顯示,進行拍照預覽。在佈局檔案中新增SurfaceView。

2、對相應許可權進行設定,同調用第三方相機。

3、為SurfaceView設定回撥

  1. sf_camera.getHolder().addCallback(new SurfaceHolder.Callback() {  
  2.     @Override
  3.     publicvoid surfaceCreated(SurfaceHolder holder) {  
  4.         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {  
  5.             /** 
  6.              * 請求許可權是一個非同步任務  不是立即請求就能得到結果 在結果回撥中返回 
  7.              */
  8.             requestPermissions(new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}, 2);  
  9.         } else {  
  10.             //開啟相機 前置攝像頭
  11.             openCamera(front_camera);  
  12.         }  
  13.     }  
  14.     @Override
  15.     publicvoid surfaceChanged(SurfaceHolder holder, int format, int width, int height) {  
  16. 相關推薦

    關於呼叫相機有關知識6.0新增許可權使用

    一、呼叫系統相機拍照 拍照和相簿的功能在實際開發中是最常見的功能,這裡記錄下。 準備工作 許可權 <!-- 往SDCard寫入資料許可權 --> <uses-permission android:name="

    Android許可權管理原理6.0-4.3

    Android 4.3-5.1 AppOpsManager動態許可權管理(官方不成熟的許可權管理) AppOpsManager 是Google在Android4.3-Android5.0引入的動態許可權管理方式,但是又與Google覺得不成熟,所以在每個發行版

    untiy 5.4.1平臺下打包除錯5.4.0打包後安裝到手機會報錯無法初始化

    安卓平臺除錯 shader進入寫程式碼階段後就想著打包到安卓平臺除錯。unity5.4.0b和unity5.4.0f版都不行,雖然他們可以打包出來,但是手機安裝後就報錯: Unable to initalize the unity engine.無法初始化!網上找了許久說是

    獲取APK的SHA1值Android安裝包SHA1指紋

    接入QQ錢包支付的時候,需要獲取這個值,獲取的方法: 1) 將apk修改後綴為 .rar檔案後解壓; 2) 進入解壓後的META-INF目錄,該目錄下會存在檔案CERT.RSA 3) 在該目錄下開啟cmd,輸入命令 :keytool -printcert -file CER

    Android拍照及圖片裁剪、呼叫系統相簿相容6.0以上許可權處理及7.0以上檔案管理

    前言: 最近工作修改較舊的專案時,涉及到了圖片相關功能 ,在使用安卓6.0手機及7.1手機拍照時,遇到了因許可權及檔案管理導致程式崩潰等問題。 剛好把功能修改完,把程式碼簡單地貼一下,方便以後使用。 本文demo包含以下要點: Android6.0執

    Android許可權管理原理6.0

    前言Android系統在MarshMallow之前,許可權都是在安裝的時候授予的,雖然在4.3時,Google就試圖在原始碼裡面引入AppOpsManager來達到動態控制權限的目的,但由於不太成熟,在Release版本中都是把這個功能給隱藏掉的。在6.0之後,Google為

    cordova開發H5APP7相機閃退問題

    場景:用圖片上傳外掛、然後更換頭像。         ios、以及非android7都不會閃退、然而7的時候回閃退。         as是2.3.2 SDK是安裝as自帶的26 解決過程:嫌麻煩、就直接看最後的解決方案 首先百度了前一位的安卓7閃退解決方案、  

    呼叫系統相機拍照並且顯示在ImageView上

    並沒有什麼技術難點,只是在儲存到sdCard的時候有一點小細節需要注意,所以寫了這篇文章。程式碼很簡單,就不解釋什麼了,直接貼上原始碼。 public class TakePhotoActivity extends AppCompatActivity { @Ove

    呼叫系統自帶分享功能分享文字,分享大圖片,仿好奇心日報分享長圖片不用申請微信微博官方sdk就能直接分享

    當前安卓分享一共三種方式 1,呼叫安卓系統自帶分享功能(可以分享大圖) 2,呼叫微信,微博支付寶等自己的官方分享sdk 3,用友盟,shareSdk等整合好的sdk 由於公司業務要求,需要分享一些長圖,大圖到微信,微博等。由於微信微博自己的官方sdk對圖片有限制, 比如微博

    呼叫手機的相簿與相機獲取圖片並適配到控制元件

    在之前做專案的時候用到了調取系統相機的工能所以在這裡做了一下總結,這是本人第一次寫東西有很多不懂得地方或者有解釋不明白的地方 希望大家前來指正不多說直接上程式碼: 首先是佈局頁面 <LinearLayout xmlns:android="http://schemas

    Unity呼叫原生的通用前奏血淚史

       老早就想著寫一篇關於unity與安卓互動的部落格記錄了,一直也沒有時間剛好最近專案與安卓原生的互動很頻繁。就想著順帶記錄一下我的安卓互動血淚史。網上 的參考部落格很多很多五花八門,琳琅滿目,其實都挺不錯的但是呢在實際開發過程中會遇到各種各樣的 你想不到的坑,而這些坑只能

    手機GPU OpenCL總結

    性能 網上 gin bsp 策略 測試的 公司 ocl adding 前段時間,把市面上手機GPU OpenCL支持情況做了一個總結。總結如下: 目前,手機 GPU 市面有四個公司產品:Qualcomm, Imagination Technologies,ARM, Viva

    文件存儲

    tostring rate 存儲 gen ide import ins troy ace package com.example.sql_file_Input; import java.io.BufferedWriter;import java.io.FileOutputS

    自動化測試:Robotium測試demo

    for 切換 ini too demo edittext pin dex bsp 1、下載Robotium打開: http://code.google.com/p/robotium/下載:robotium-solo-3.4.1.jar (寫測試用例時需要依賴此包)2、需要把

    Android 呼叫相機、相簿適配6.0

    又好久沒有寫部落格了,好習慣不能斷,該寫點就得寫點,今天帶來的筆記是關於Android 專案呼叫系統相機 與呼叫系統相簿的之後拿到照片的基本操作,我感覺好多人還是不太熟悉的哈。專案相容 Android 5.0裝置、Android 6.0裝置、Android 7.0、Android 8.0

    視訊播放器——ijkPlayerBilibili開源

    作為一個B站(Bilibili)使用者,特別喜歡B站的播放器 湊巧,發現了b站的github的地址。。嘿嘿。。B站github地址f 發現了ijkplayer播放器,支援android 和ios 我們用AndroidStudio新建project名字是bilibili_ijkplay

    網頁無法使用微信瀏覽器開啟手機:該證書並非來自可信賴的授權中心

    生成二維碼的時候發現網頁無法在微信瀏覽器裡開啟,檢查了二維碼對應的URL連結沒有錯誤,在CHROME裡也能開啟,用安卓自帶的手機瀏覽器開啟時,提示:該證書並非來自可信賴的授權中心。 使用這個SSL檢查站檢查,發現前四項正常,第五項報錯:A valid Root CA Certificate

    自學筆記第一彈有點凌亂QAQ

    安卓學習筆記 第一章: (1):HelloWorld 1.分析安卓專案結構: 主要開發工作在app目錄下進行(在此主要記錄此目錄); bulid:包含編譯時自動生成的檔案 libs:如果使用第三方jar包,需放在該目錄下,其會自動新增到構建路勁中去 andro

    呼叫相簿出錯不選擇圖片推出後無法再次選擇

    onActivityResult加上判斷條件 若果沒有選擇返回null @Overridepublic void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(reques

    Android呼叫相簿、相機相容6.0、7.0、8.0所需新增許可權

    在AndroidManifest.xml中新增: <!--讀寫記憶體塊許可權--> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/&