iT邦幫忙

第 11 屆 iThome 鐵人賽

0
自我挑戰組

練習程式系列 第 32

Android, camera(續) , SQLite, java判斷圖片檔

接著Android 拍照並顯示照片

就先練習camera 和 SQLite:

整理

1 SQLite

Android SQLite Database Tutorial 2 # Introduction + Creating Database and Tables (Part 2)
Android SQLite Database Tutorial (Select, Insert, Update, Delete)

SQLite在android studio本來就有,不用載任何東西。資料庫也是存在手機端。

SQLite不是一個用戶端/伺服器結構的資料庫引擎,而是被整合在用戶程式中

練習完後就想來找檔案。

2

android studio 3.0 Device Explorer - run as: could not set capabilities: Operation not permitted

Samsung的手機似乎會有這個問題:run as: could not set capabilities: Operation not permitted。所以看不到檔案,目前不知道解決方法。就先放棄找檔案了(一般手機好像都看不到sqlite,sharedPreferences(實際上是一個.xml檔),要root才行,所以就用android studio模擬器先觀察)

Device File Explorer的位置:
View on-device files with Device File Explorer
https://ithelp.ithome.com.tw/upload/images/20191015/20111994Hd4byj6ZXx.png

參考:
Android SQlite資料庫存放的具體位置

3

繼續練習拍照功能:
Take Picture with Camera - Android Studio - Java
照著這部,可以拍照,可是顯示不了圖片,會有例外:

Unable to open content: content://media/external/images/media/173
    java.io.FileNotFoundException: No such file or directory

看來是因為路徑不正確之類的。目前不知怎麼解決。

回到之前那部影片的方法,也是圖片跑不出來:
Capture picture from camera - Android Studio Tutorial
影片類似這個解答:
Getting null uri in onActivityResult after take image capture [duplicate]

試了一下,發現這部影片程式碼還是都正確,跟之前一樣,只要修改

AndroidManifest.xml:
android:name="androidx.core.content.FileProvider"

問題是
setImageBitmap() is not working

可能是因為setImageBitmap的功能不夠,所以顯示不出圖片。換成glide就可以:

Glide.with(MainActivity.this)
        .load(new File(path)) // Uri of the picture
        .into(imageView);

4

繼續練習看不懂的東西:

Environment.DIRECTORY_PICTURES (手機的Pictures資料夾)
顯示:Pictures

應該更這個檔案無關(file_paths.xml):

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path
    name="hi_images"
    path="Pictures/" />
</paths>
getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); //顯示完整路徑
/storage/emulated/0/Pictures 

關於手機的路徑要用Device File Explorer查看,不過看不到/storage/emulated/0/Pictures ,因為權限問題。

FileProvider.getUriForFile產生的url,不了解意思:

Uri photoURI = FileProvider.getUriForFile(MainActivity.this,
                            "com.example.takephoto.fileprovider",
                            photoFile);

長這樣:

content://com.example.takephoto.fileprovider/hi_images/20191015_151502-1333268471.jpg

com.example.takephoto.fileprovider就是provider的android:authorities,隨便任何字都可以。
hi_images也是file_paths.xml自訂的

5 拍照完後,檔案的位置(在哪個資料夾或創建資料夾):

Android - Save images in an specific folder

解答2:
先創建資料夾,在創建檔案,檔案再給照相機放byte圖片檔

Environment.getExternalStorageDirectory() + "/資料夾名稱";

6

可能要來研究如何用java判斷圖片檔:
Test if a file is an image file
Java判断文件是否为图片

好像不管怎樣都無法完全判斷圖片檔。推薦的方法好像是imageIO


上一篇
Android OkHttp and Gson 和 log的問題 、Retrofit、MVVM
下一篇
Android ,存圖片到SQLite,process、thread、ByteArrayOutputStream
系列文
練習程式37
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言