2013年5月21日

【Android】開啟相機-照相功能與相簿-相片集並讀取相片匯入至程式

各位Android安卓開發者大家好 ^^

小黑人今天要跟大家分享的是如何"開啟相機"與"開啟相簿"並且將"圖片讀取匯入至程式內",如果各位開發者有接觸到拍照及相簿功能的話,那今天這個主題就會非常的息息相關囉,而且照相這個功能其實可以運用在很多地方,像Google Play上也有許許多多的拍照APP或者是圖片編輯APP,而這些APP都是跟開啟相機進行照相或者是從SD卡讀取相片圖片有關係,今天小黑人就與大家分享如何簡單的將照片匯入至程式內。

1.首先,要開啟相機功能與拍照後將相片存入SD卡內,則需要在AndroidManifest.xml開啟權限,所以我們先在AndroidManifest加入開啟相機權限與寫入SD卡權限 :
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

2.Layout版面配置,小黑人自己先大概排個版面,畫面上有開啟相機Button、開啟相簿Button及顯示匯入照片的ImageView :
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>

    <ImageView
    android:id="@+id/img"
    android:layout_width="match_parent"
    android:layout_height="300dip"   
    />

    <Button
    android:id="@+id/camera"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="開啟相機"
    android:layout_weight="1"
    android:layout_gravity="center_vertical"
    />
   
    <Button
    android:id="@+id/photo"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="開啟相簿"
    android:layout_weight="1"
    android:layout_gravity="center_vertical"
    />

</LinearLayout>

3.最後就是開啟程式(.java)將各功能寫入啦 :
public class MainActivity extends Activity
{
   //宣告
   private ImageView mImg;
   private DisplayMetrics mPhone;
   private final static int CAMERA = 66 ;
   private final static int PHOTO = 99 ;
       
   @Override
   protected void onCreate(Bundle savedInstanceState)
   {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);
               
      //讀取手機解析度
      mPhone = new DisplayMetrics();
      getWindowManager().getDefaultDisplay().getMetrics(mPhone);
           
      mImg = (ImageView) findViewById(R.id.img);
      Button mCamera = (Button) findViewById(R.id.camera);
      Button mPhoto = (Button) findViewById(R.id.photo);
               
      mCamera.setOnClickListener(new OnClickListener()
      {
         @Override
         public void onClick(View v)
         {
         //開啟相機功能,並將拍照後的圖片存入SD卡相片集內,須由startActivityForResult且
         帶入
         requestCode進行呼叫,原因為拍照完畢後返回程式後則呼叫onActivityResult
         ContentValues value = new ContentValues();
         value.put(Media.MIME_TYPE, "image/jpeg");                                     
         Uri uri= getContentResolver().insert(Media.EXTERNAL_CONTENT_URI,
                                              value);
         Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
         intent.putExtra(MediaStore.EXTRA_OUTPUT, uri.getPath()); 
         startActivityForResult(intent, CAMERA);     
         }
      });
               
      mPhoto.setOnClickListener(new OnClickListener()
      {
         @Override
         public void onClick(View v)
         {
         //開啟相簿相片集,須由startActivityForResult且帶入requestCode進行呼叫,原因
         為點選相片後返回程式呼叫onActivityResult
         Intent intent = new Intent();
         intent.setType("image/*");
         intent.setAction(Intent.ACTION_GET_CONTENT);
         startActivityForResult(intent, PHOTO);
         }
      });
   }
       
   //拍照完畢或選取圖片後呼叫此函式
   @Override
   protected void onActivityResult(int requestCode, int resultCode,Intent data)
   {
      //藉由requestCode判斷是否為開啟相機或開啟相簿而呼叫的,且data不為null
      if ((requestCode == CAMERA || requestCode == PHOTO ) && data != null)
      {
         //取得照片路徑uri
         Uri uri = data.getData();
         ContentResolver cr = this.getContentResolver();
                     
         try
         {
         //讀取照片,型態為Bitmap
         Bitmap bitmap = BitmapFactory.decodeStream(cr.openInputStream(uri));

         //判斷照片為橫向或者為直向,並進入ScalePic判斷圖片是否要進行縮放
         if(bitmap.getWidth()>bitmap.getHeight())ScalePic(bitmap,
                                                          mPhone.heightPixels);
         else ScalePic(bitmap,mPhone.widthPixels);
         }
         catch (FileNotFoundException e)
         {
         }
      }
               
      super.onActivityResult(requestCode, resultCode, data);
   }
       
   private void ScalePic(Bitmap bitmap,int phone)
   {
      //縮放比例預設為1
      float mScale = 1 ;
               
      //如果圖片寬度大於手機寬度則進行縮放,否則直接將圖片放入ImageView內
      if(bitmap.getWidth() > phone )
      {
         //判斷縮放比例
         mScale = (float)phone/(float)bitmap.getWidth();
                     
         Matrix mMat = new Matrix() ;
         mMat.setScale(mScale, mScale);
                         
         Bitmap mScaleBitmap = Bitmap.createBitmap(bitmap,
                                                   0,
                                                   0,
                                                   bitmap.getWidth(),
                                                   bitmap.getHeight(),
                                                   mMat,
                                                   false);
         mImg.setImageBitmap(mScaleBitmap);
      }
   else mImg.setImageBitmap(bitmap);
   }
}

畫面預覽 :
以上就是今天小黑人跟大家分享的內容,照相與相簿的匯入運用,希望大家可以試試看~ ^^
如有任何問題可以跟小黑人討論交流唷!謝謝大家 XDD

86 則留言:

  1. 相機好像不能開啟..

    回覆刪除
    回覆
    1. 可以拍照了.. 但是拍完照之後沒有辦法回到顯示圖片

      刪除
    2. 哈囉~~開啟相機需要加入權限唷^^
      然後無法回到顯示圖片應該是照片的像素太大導致手機記憶體不足而造成出錯,所以如果要防止讀取照片時造成記憶體不足的話,在讀取圖片Bitmap時要加入一些處裡,方法如下 :

      在onActivityResult裡 :

      原本讀取圖片Bitmap為 :
      Bitmap bitmap = BitmapFactory.decodeStream(cr.openInputStream(uri));

      現在要更改成 :
      BitmapFactory.Options mOptions = new BitmapFactory.Options();
      //Size=2為將原始圖片縮小1/2,Size=4為1/4,以此類推
      mOptions.inSampleSize = 2;
      Bitmap bitmap = BitmapFactory.decodeStream(cr.openInputStream(uri),null,mOptions);

      在讀取圖片Bitmap時加入mOptions參數進行縮圖,
      這樣就可以防止讀取圖片時造成圖片過大或記憶體不足而出現OutOfMemory錯誤 ^^

      刪除
  2. 是否因為畫素太高,所以沒有辦法顯示

    回覆刪除
    回覆
    1. 沒錯~因為讀取照片時,照片的像素過大而導致手機記憶體不足,所以解決方法如下 :

      在onActivityResult裡 :

      原本讀取圖片Bitmap為 :
      Bitmap bitmap = BitmapFactory.decodeStream(cr.openInputStream(uri));

      現在要更改成 :
      BitmapFactory.Options mOptions = new BitmapFactory.Options();
      //Size=2為將原始圖片縮小1/2,Size=4為1/4,以此類推
      mOptions.inSampleSize = 2;
      Bitmap bitmap = BitmapFactory.decodeStream(cr.openInputStream(uri),null,mOptions);

      在讀取圖片Bitmap時加入mOptions參數進行縮圖,
      這樣就可以防止讀取圖片時造成圖片過大或記憶體不足而出現OutOfMemory錯誤 ^^

      刪除
    2. 謝謝^^

      刪除
    3. 可是使用拍照之後 它會幫我另外存出圖片出來 但是那些圖片是不能用的 我也不希望會多出那些圖片 可以教我怎麼弄掉嗎^^ 謝謝~~

      刪除
    4. 因為這個寫法是呼叫相機功能進行拍照,當然拍照後也會跟著手機拍照功能的流程走(包含儲存的動作),所以如果不希望拍照後的相片儲存至手機的話,小黑人這邊有兩種作法:第一種是自製一個相機拍照畫布(顯示畫面方框)進行拍照及畫面擷取(不含儲存),這個主題小黑人會在之後的文章分享給大家^^ ,第二種就是以目前的寫法然後在最後將拍照的圖片刪掉,流程是會"拍照"->"儲存圖片"->"擷取圖片至APP"->"刪除圖片",這樣手機內就不會多出那些照片囉,刪除照片作法如下:

      在onActivityResult裡:

      在取得
      Uri uri = data.getData();
      ContentResolver cr = this.getContentResolver();
      後面要加上下面這段來抓取圖片路徑,

      String[] mMediaDATA = { MediaStore.Images.Media.DATA };
      Cursor mCursor = managedQuery(uri,mMediaDATA,null,null,null);
      int mImageIndex = mCursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
      mCursor.moveToFirst();

      String mPath = mCursor.getString(mImageIndex);
      File mFile = new File(mPath);

      //mPath和mFile就這現在這張圖片的路徑

      最後等程式都跑完後再將圖片刪掉,跑完ScalePic()時最後刪掉圖片,
      寫法是:
      if(mFile.exists()) mFile.delete();
      這樣就把圖片刪掉囉!^^

      刪除
  3. 請問一下 為什麼相機開不了

    回覆刪除
    回覆
    1. 哈囉~~開啟相機需要加入權限唷^^
      不知道權限是否有開啟?

      刪除
    2. 您好,我已經在manifest裡加入權限了,為何在開啟相機按鈕時還是會閃退?
      相機部分無法執行。

      刪除
  4. 哈囉 你好
    我想請問一下 我拍照完的照片 不會儲存在sd card 可能是什麼問題啊?

    回覆刪除
    回覆
    1. 不好意思喔,小黑人最近在研究開發一些新技術元件,
      ...現在才看到留言!!! 抱歉~~~ >"<
      哈~好啦,針對你的問題,拍照完照片不會存在SD卡,
      因為拍照這部分小黑人是用Intent呼叫內建拍照程式,
      所以正常應該是會存起來,再來原因小黑人想到的就是權限問題,
      不知道您是否有加入SD卡修改權限呢??
      下面這個:

      刪除
  5. 你好我不太懂你處理多餘照片的程式碼

    回覆刪除
    回覆
    1. 不好意思喔,小黑人最近在研究開發一些新技術元件,
      ...現在才看到留言!!! 抱歉~~~ >"<
      哈~針對你的問題,多餘照片的程式碼,
      想請問您說的是哪個部份呢??
      小黑人這邊只有在讀取照片時,首先判斷照片是直向還是橫向,
      然後再判斷照片大小尺寸是否比手機寬還大(直向照片判斷手機的寬,橫向判斷手機的長),
      如果照片尺寸較大則進行縮放,縮小成跟手機等寬。
      哈~不知您的疑問是這個嗎??

      刪除
    2. 就是會處理另外儲存但無法使用的那些照片程式碼

      刪除
    3. 您好,哈~小黑人了解您在說哪部分的程式碼了(上面回覆的那段吧) XDD
      簡單的文字敘述來說,此拍照功能是小黑人使用Intent方式呼叫手機內建相機,
      所以拍出來的照片當然也會跟著內建的拍照流程將照片儲存起來,
      然後上方小黑人所寫的程式碼是藉由onActivityResult回傳的相片data取得此張相片的儲存路徑,再將此張相片刪除。
      程式碼中間那段是藉由Cursor指向照片儲存路徑。

      感謝您! ^^

      刪除
  6. 想請問一下 要怎樣連拍??
    最近剛開始碰android

    回覆刪除
    回覆
    1. 不好意思喔,小黑人最近在研究開發一些新技術元件,
      ...現在才看到留言!!! 抱歉~~~ >"<
      哈~針對您的問題,連拍!!!
      因為拍照這部分小黑人是使用Intent來呼叫手機內建拍照程式,
      這就等同於開啟系統相機進行拍照,所以如果手機本身含有連拍功能,
      那就可以進行連拍的動作,如果沒有那就可能需要自製撰寫一個拍照的程式,
      然後在固定時間連續進行拍照。
      關於這個部分小黑人會在之後分享自製拍照程式,其中會包含對焦與連拍功能。
      感謝您的提問 ^^

      刪除
  7. 想請問:
    程式碼都沒問題也可以正常拍照或讀取照片
    1.可是離開這個程式,再點進去就不能拍照了
    2.拍照拍出來的照片會自動翻轉,翻轉的角度都是錯的
    求救~麻煩了

    回覆刪除
    回覆
    1. 不好意思喔,小黑人最近在研究開發一些新技術元件,
      ...現在才看到留言!!! 抱歉~~~ >"<
      哈~~針對您的問題,離開程式再進去就不能拍和照片會翻轉,
      1.正常來說結束App後程式會關閉,再開啟則是從新啟動,
      所以小黑人初步判斷應該是手機內建照相元件正在進行中不接受呼叫,
      或者是手機內建照相元件未正常關閉,
      原因是因為小黑人在拍照這部分是用Intent來呼叫手機內建拍照元件,
      所以呼叫不起來應該是內建拍照在進行中,您可以至設定將相機強制停止試試看喔!
      2.拍出來的照片會翻轉,因為是內件相機元件所以拍照的設定都遵從一般拍照設定,
      請問拍出來的方向不知您在相片簿裡的方向是相同的嗎??
      如果要在程式內將照片翻轉是沒問題的,
      藉由Matrix元件可以進行照片的旋轉,
      Matrix mMat = new Matrix();
      mMat.setRotate(90); //帶入旋轉角度
      以上方法您可以試試看喔,感謝您的提問!^^

      刪除
  8. 小黑人
    我想問 有辦法在不預覽的情形下 拍下照片嗎?

    回覆刪除
    回覆
    1. 您好,很抱歉這麼久才回覆您!
      哈哈,小黑人這段時間忙著處理專題研究,真不好意思...
      根據您的提問小黑人向您解釋,
      答案是有辦法,但不能用此文章的方法。
      要達到不預覽拍照的方法就是自製一個拍照類別,
      這樣就可以自己控制拍照的畫面。

      感謝您的提問!

      刪除
  9. 請問小黑人,我拍照之後 然後app報錯,然後去圖片庫 找圖片 顯示灰色縮圖...我權限+防止記憶體不足也有加進去了ˊ 什麼原因呢?

    回覆刪除
    回覆
    1. 您好,很抱歉這麼久才回覆您!
      哈哈,小黑人這段時間忙著處理專題研究,真不好意思...
      根據您的提問小黑人向您解釋,
      權限其實是要加入開啟相機的權限和讀取SD卡資料夾的權限,
      在拍照的畫面時是開啟手機內建的相機,所以不至於會產生錯誤,
      可能要再麻煩您將錯誤回報的訊息告知小黑人。

      感謝您的提問!

      刪除
  10. 您好,請問使用前鏡頭,卻發現影像上下顛倒(直屏),橫屏時左右相反,該修該哪裡呢

    回覆刪除
    回覆
    1. 您好,根據您的問題小黑人向您解釋,
      此範例小黑人為呼叫系統的照相程式,
      所以拍照的部分都是手機內建系統控制,
      相對的拍出來的畫面與效果也會跟手機直接開啟相機拍一樣,
      所以應該是不會顛倒的狀況,若直接開相機拍正常這範例也就會正常。
      但若您是自製撰寫照相Camera程式的話,就可以由程式端進行上下左右翻轉的動作,
      您可以試試看Camera元件設定旋轉方向喔。

      感謝您的提問!

      刪除
  11. 您好,請問可以改成照相時把圖片存到特定位置嗎?

    回覆刪除
    回覆
    1. 另外我發現一個問題,如果選拍照但是在拍照界面按返回,會存一張不能開啟的照片在像片資料夾,不知道有沒有辦法解決

      刪除
    2. 您好,根據您的提問小黑人向您解釋,
      因為範例程式是呼叫系統相機功能,所以儲存位置也是遵從系統的設定,
      如果要指定特定位置的話,方法有許多種可以嘗試執行,
      例如像是把原本系統儲存的圖片複製到指定位置,或者是將回傳的Bitmap再另行儲存,或者是自製相機程式指定瀏覽儲存畫面也可,
      而您提出的另一個不能開啟的照片應該是系統照片的暫存緩衝檔,像是一個還沒有完成圖片的檔案,所以不能開啟,
      感謝您的提問!

      刪除
    3. 我了解了,謝謝小黑人!

      刪除
  12. 小黑人您好 我已照您的code實作 相機 相簿 都可以開啟 但問題是在 開啟後 選完再照片 卻會造成 成是已停止的問題 不知道是為什麼 有可能式版本問題嗎?? 還是權限加錯地方?? 又或者是如前面提問的一樣是像素問題?? 又或者是找不到相片路徑?? 還請小黑人大大幫忙唷~ 萬分感謝~

    回覆刪除
    回覆
    1. 您好,根據您的提問小黑人與您解釋,
      依您這樣敘述小黑人其實也不知道問題在哪邊...
      可能還要麻煩您看一下LogCat的錯誤訊息,
      小黑人分析應該不會是權限問題,如果是權限問題會一開起相機就出錯,
      至於版本應該也不會影響,所以還要您檢查一下錯誤的訊息...
      再麻煩您確認。

      感謝您的回覆!

      刪除
    2. 作者已經移除這則留言。

      刪除
  13. 作者您好!
    想要請問如何取得該相片的經緯度呢 ?
    麻煩您解惑了 ! 謝謝!

    回覆刪除
  14. 上面的程式是讀取圖片庫的圖片,和現拍照下來的圖片。
    那請問版主,
    要如何抓下裝置的畫面來當圖片呢?

    回覆刪除
    回覆
    1. 您好,根據您的提問小黑人與您解釋,
      您說的沒錯,此範例為讀取圖片與照相功能,
      如果要擷取手機裝置當前畫面的話,參考如下 :
      View mView = MainActivity.this.getWindow().getDecorView();
      mView.setDrawingCacheEnabled(true);
      mView.buildDrawingCache();
      Bitmap mBitmap = mView.getDrawingCache();
      mView.destroyDrawingCache();
      這個mBitmap就是手機目前的畫面,再放入ImageView即可顯示.

      感謝您的提問.

      刪除
  15. 小黑人您好
    選擇相簿照片功能正常
    但使用相機拍照確認後會退出APP
    縮圖的部分改過後會出現一樣的問題!!

    回覆刪除
    回覆
    1. 您好,根據您的提問小黑人與您解釋,
      這個原因小黑人覺得應該是Android系統版本的差異導致在onActivityResult回傳的內容不同,
      再與您確認出錯的地方是開啟系統相機進行拍照,然後再點選拍照按鈕後才退出App?
      如果是這個步驟出錯的話,您可以印出Log看看onActivityResult回傳的內容是什麼,
      然後再依範例程式一樣,將Bitmap放入ImageView即可.

      感謝您的提問!

      刪除
  16. 您好~~
    請問一下我按下相機的按鈕時,app就停止回應了要怎麼解決?

    回覆刪除
    回覆
    1. 現在可以進入相機拍照了,但是拍完照後,按下確定鈕,程式就停止回應了..
      然後在相簿內的照片是灰色的(顯示無縮圖)
      我在log cat的錯誤訊息→http://i.imgur.com/KEHwlal.png?1

      刪除
    2. 我將 final static int CAMERA =66; 改為-1 相機就可以存了,但是存下的圖片是灰色的,然後要取用那張圖片時app就會停止回應...

      刪除
  17. 作者已經移除這則留言。

    回覆刪除
  18. 我想請問小黑人~ 這個飯粒有更詳細的詳解嗎~ 我好想學... 3QQ

    回覆刪除
  19. 您好 請問一下 ~ 縮小的圖片放到imgview裡 如果我要對已縮小的照片做處理 要怎麼做呢?
    要怎麼抓取為縮小照片的位置~ 我想用灰階 ~ 3qq

    回覆刪除
  20. 請問,我拍完照之後是成功的,也有顯示
    可是會多帶一個類似破圖的檔案.
    拍一張,變兩張這樣

    回覆刪除
  21. 不好意思
    我是某科大學生
    我們現在畢業專題需要做一APP使用相機
    目前在以下程式碼使用"""標注起來的部分出現問題
    不知是哪方面沒有設定好 所以一直無法開啟相機
    請問是出現什麼問題呢
    ImageView以及android:text="開啟相機"那是一開始就是黃底線驚嘆號了
    請問我該怎麼做呢

    setContentView(R.layout."""main""");
    Button mCamera = (Button) findViewById(R.id."""camera""");
    Button mPhoto = (Button) findViewById(R.id."""photo""");
    value.put("""Media""".MIME_TYPE, "image/jpeg");
    Uri uri= getContentResolver().insert("""Media""".EXTERNAL_CONTENT_URI,value);
    """Matrix""" mMat = new Matrix() ;
    <"""ImageView"""
    android:id="@+id/img"
    android:layout_width="match_parent"
    android:layout_height="300dp"
    />

    回覆刪除
    回覆
    1. 您好,根據您的提問小黑人與您解釋,
      關於黃色驚嘆號的部分是屬於警告的意思,
      android:text="開啟相機"會出現警告的原因是不建議將文字直接寫在這裡,
      是建議您把文字寫在string.xml裡,例如: android:text="@string/text",
      但出現警告標示也不至於會影響到程式的運作,可能要再看看發生錯誤的原因。

      感謝您的提問!

      刪除
    2. 謝謝您~
      已成功開啟!!

      刪除
  22. 請問一下~ 您的步驟3..最後就是開啟程式(.java)將各功能寫入啦 :
    是要覆蓋原先的java內容還是直接打在原程式的下面呢?

    回覆刪除
    回覆
    1. 您好,根據您的提問小黑人與您解釋,
      步驟3指的是MainActivity的程式碼,
      您可以開啟MainActivity將範例程式寫入,
      照您的說法的話應該是覆蓋原先的內容而不是寫在原程式下面喔。

      感謝您的提問!

      刪除
    2. 我補充一下好了,第一個要注意的是onCreate中如果是開新範例的話,
      應該會有setContentView(R.layout.xxxx);←就是填寫layout層的主表單,
      再將樓主的程式碼打在onCreate下面,
      當然import是要打在上面的import列表。
      接下來就是用alt+enter的方式在紅字的部份加上相對應的類別,
      應該就可以執行了。

      刪除
    3. 請問一下~ import列表要輸入甚麼?@@
      我照做,不過很多error出現
      新手發問~感激不盡>.<

      刪除
    4. 作者已經移除這則留言。

      刪除
    5. 就是要在紅色字的部份使用"Alt"+"Enter" 加入class。

      刪除
  23. 請問我有二個裝置一個是android4.0以上版本另一個是2.3.4版本,依您的程式去執行,在4.0可以但在2.3.4卻出現應用程式異常終止的訊息視窗,請問有辦法解決嗎?

    回覆刪除
    回覆
    1. 您好,根據您的提問小黑人與您解釋,
      很感謝您提供這個版本差異狀況的訊息,
      範例程式應該是可以支援android不同的版本,
      這個問題應該是可以解決,但小黑人還需要更多錯誤原因資訊,
      目前還需要您檢查看看錯誤印出的Log是什麼。

      感謝您的留言!

      刪除
    2. 好的,在裝置上是看到"應用程式(程序:com.mycompany.myopencv)異常終止。請再試一次,確認鈕就是強制關閉",我是用Android Stuidio寫的,請問更多的錯誤訊息是要看那邊?是log嗎?
      如果是的話如下:
      03-26 03:46:40.992 11204-11204/com.mycompany.myopencv D/AndroidRuntime﹕ Shutting down VM
      03-26 03:46:40.992 11204-11204/com.mycompany.myopencv W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x40175560)
      03-26 03:46:40.992 11204-11204/com.mycompany.myopencv E/AndroidRuntime﹕ FATAL EXCEPTION: main
      java.lang.UnsupportedOperationException: Unknown URI: content://media/external/images/media
      at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:146)
      at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:114)
      at android.content.ContentProviderProxy.insert(ContentProviderNative.java:408)
      at android.content.ContentResolver.insert(ContentResolver.java:604)
      at com.mycompany.myopencv.MainActivity$1.onClick(MainActivity.java:54)
      at android.view.View.performClick(View.java:2485)
      at android.view.View$PerformClick.run(View.java:9080)
      at android.os.Handler.handleCallback(Handler.java:587)
      at android.os.Handler.dispatchMessage(Handler.java:92)
      at android.os.Looper.loop(Looper.java:130)
      at android.app.ActivityThread.main(ActivityThread.java:3683)
      at java.lang.reflect.Method.invokeNative(Native Method)
      at java.lang.reflect.Method.invoke(Method.java:507)
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
      at dalvik.system.NativeStart.main(Native Method)

      刪除
    3. 我查一下其中的錯誤碼,Unkown URI 應該是我沒有SD卡,因為我是用開發板來做的,那請問小黑人,這部份可以改成儲在內部空間嗎?

      刪除
  24. 你好,如果想拍照也記錄下當下的經緯度 該怎麼做到呢?><"?

    回覆刪除
  25. 你好,請問 如果我要把相機拍照好的相片儲存到SQLite
    再一一把已儲存的相片顯示在相簿裡
    這個部分 應該要怎麼修改?

    回覆刪除
  26. 小黑人你好! 請問我想要讀取照片的地理位置(經緯度) 要怎麼匯入呢?
    另外我如果我想要選取多張照片顯示,要怎麼做呢?麻煩你了 謝謝!

    回覆刪除
  27. 我想問一下為什麼拍完照案儲存系統直接當掉~ 麻煩妳了

    回覆刪除
  28. 作者已經移除這則留言。

    回覆刪除
  29. 作者已經移除這則留言。

    回覆刪除
  30. 你好
    如果想把拍完的照片直接上傳到google drive呢
    路徑要怎麼設
    我卡在這想了很久
    謝謝

    回覆刪除
  31. 請問小黑人
    有關照相功能除了呼叫自動照相功能外 是否還可以做更進階的設定
    例如:感應器 光圈大小 焦距...等的方法
    有範例或是書籍可以參考或建議嗎
    非常感謝

    回覆刪除
  32. 我也想知道如何對顯示的圖片做處理 它的位置在哪裡 還是我要在新增一張新的bitmap
    讓他也有顯示的圖片之後再去做處理 求詳解

    回覆刪除
  33. 大大你好!
    請問一下RUN來手機都正常
    但是一開相機就閃退AndroidManifest有加權限了
    請問肇事什麼問題?

    回覆刪除
    回覆
    1. 我也是

      刪除
    2. 版本 android6 以上嗎?
      是的話是權限問題唷, 要做權限詢問看使用者有沒有給權限

      刪除
    3. 否則會停太久閃退, android6 以上要額外處理的部分
      相機就是詢問 WRITE_EXTERNAL_STORAGE and CAMERA

      刪除
  34. 作者已經移除這則留言。

    回覆刪除
  35. 小黑人您好~
    如果想讓提供使用者剪裁之類的編輯功能
    該從何下手呢?

    回覆刪除
  36. 你好~請問小黑人
    我要怎麼設定讓下次讀取圖片不覆蓋前一次讀取的圖片

    回覆刪除
  37. 為什麼我從相簿選取完APP會自動關閉

    回覆刪除
    回覆
    1. 雖然我不是照著小黑人做的,但情況跟我一樣,你有找到問題了嗎?

      刪除
  38. 請問小黑人~您的media與media用法是做甚麼的~我找不到您相關的用法,顯示紅字

    回覆刪除
  39. 請問為什麼 開啟相機會閃退呢~~感謝

    回覆刪除
  40. 小黑人 請問你還在嘛~~?
    有email可以聯絡你嗎 我有問題想問 謝謝

    回覆刪除
  41. 您好 請問一下我的安卓手機版本是5.0.2 但只要用這個程式碼 開啟相機就會出現"很抱歉,APP已停止運作"的訊息就閃退了

    權限那段程式碼也有加進manifest裡了 不知是不是哪裡有出錯或是我的手機版本5.0.2太低的關係呢?謝謝~

    回覆刪除
  42. 小黑人 我想請教一下
    為什麼我只要開啟相機就會閃退呢?

    回覆刪除
  43. 小黑人您好
    小弟最近在做手機拍照
    仿造您的範例之後發現拍照後相片無法在imgview預覽
    我也已經有參照您的建議進行縮圖
    按了之後回到初始畫面但是imgview還是沒有圖片~
    請救救我~

    回覆刪除
  44. 請問為什麼要預設Camera =66, Photo =99呢?

    回覆刪除
  45. 你好,請問一下,我呼叫相機拍照後,拍照後它似乎出進入相機自訂的流程,要我退出或儲存,無法進入我設定的下個流程,請問該怎麼解決?感謝!

    回覆刪除

謝謝大家支持,有任何問題都可以和小黑人一起討論!