android 7.0之后的打开相机拍摄头像上传
今天一天都在搞這個頭像相關的android開發(fā),不斷的在網(wǎng)上查找資料,什么都不懂,然后就照抄。
就是一個什么問題呢,現(xiàn)在android打開一個相機不再簡單的請求打開就行了,按照我今天查到的資料,就是說文件的URI不能在本APP之外被使用,所以需要進行一個轉(zhuǎn)換,然后我隨便找到了一種方法好像是直接獲取到URI 的,然后拍攝成功了,但是晚上我不知道作了一些什么,突然就開始報錯說SQLite有UNIQUE限制,我什么也不懂啊,也是一頓查,說是因為有一些SQLIte的列里面是不能允許有重復的東西的,所以我想說是不是我的圖片的存儲路徑不能相同啊,我就該了一下,發(fā)現(xiàn)還是不幸,還是相同的錯誤,于是我尋求了另外一種方法。
通過FileProvider來臨時提供一個URI供給本APP之外的應用使用。話不多說,下面直接上代碼吧。其實剛開始這種方法我也不知道是怎么回事,說實話我現(xiàn)在也不知道這個是怎么回事,但是一頓摸索之后總算是弄出來了。
參考:https://blog.csdn.net/u011418943/article/details/77712662
1.選擇是采用什么方式獲得照片()
case R.id.camera:Log.e("TAG","open camera to get a pic");from_camera(FROM_CAMERA);Log.e("TAG", "start camera");break; case R.id.photo:Toast.makeText(MainActivity2.this, "choose a pic from photo", Toast.LENGTH_SHORT).show();from_photo(FROM_PHOTO);break;2.開始處理了:
private void from_camera(int fromCamera) {Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);//這里我在查看我保存頭像的文件夾是不是已經(jīng)存在了//我選擇的是保存在我手機的SD卡中,也就是ExternalStorage的,注意以下,因為后面會涉及到你的一些配置if(!Profile_Dir.exists()){Profile_Dir.mkdir();}//圖片文件File mTmpFile = new File(Profile_Dir, "/"+getName()+".png");Uri uri ;//檢查這個版本的吧,就是這個東西搞得挺復雜的,不然不需要很麻煩的if (Build.VERSION.SDK_INT >= 24){//獲得URIuri = FileProvider.getUriForFile(MainActivity2.this,"Advance", //這個可以隨便取 ,但是要和到時候你的配置相對應(authorities) mTmpFile);}else{uri = Uri.fromFile(mTmpFile);}Log.e("TAG", String.valueOf(uri));//打開相機intent.putExtra(MediaStore.EXTRA_OUTPUT,uri);startActivityForResult(intent,fromCamera);//處理}下面就把上面的相應配置說明:
首先是Manifest中注冊provider(FileProvider):
<providerandroid:name="androidx.core.content.FileProvider" <--! 注意這個name不同的版本肯呢個有一些不同,我在這個上面也吃了一點苦,可以上網(wǎng)查現(xiàn)在是什么-->android:authorities="Advance"<--!這個authorites就是我上面說可以隨便取的,我這里是是取的我自己的包名,記得要相同-->android:exported="false"android:grantUriPermissions="true"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/file_paths"/></provider> <--! 其余的可以和我這個一樣-->?android:resource="@xml/file_paths"/>相應地要在你的res文件家下面新建一個xml文件夾,然后在里面創(chuàng)建一個file_paths的文件
<paths xmlns:android="http://schemas.android.com/apk/res/android"><external-path name="camera" path="APP頭像"/> </paths>還記得我說我是把圖片保存在我的SD卡里面嗎?在這里就需要創(chuàng)建一個<external-path的標簽,這個標簽就是指明是Environment.getExternalStorage()這個路徑,然后在里面的path寫下你想要共享的SD卡中的文件夾,如果不寫好像是共享所有的文件夾的,但是我覺得還是不要了,因為我不懈的話他報錯了『嗚嗚嗚總是報錯』,那個name就沒什么關系,只是一個虛擬的文件夾。
好了,就是這個我如果保存在SD卡是這個external-path標簽,那么其他的相應的是:
<files-path /> = getFilesDir()
<cache-path /> = getCacheDir()
<external-path /> = Environment.getExternalStorageDirectory()
<external-files-path /> = Context#getExternalFilesDir(String) 或 Context.getExternalFilesDir(null)
<external-cache-path /> = Context.getExternalCacheDir()
<external-media-path /> = Context.getExternalMediaDirs()
https://www.cnblogs.com/kezhuang/p/8706988.html這是我從這個上面找到的,因為剛開始我殺也不懂嘛,然后使用的是這個上面的<files-path /> 標簽,然后就報錯了,哎呀我找不到那個是說什么了,大概就是說我的共享文件下面沒有和我的圖片文件下面的莫一個根目錄相同的,這不很明顯嗎,我的圖片在SD卡,然后file-path是getFileDir()的,根不久不是SD的,所以我該過來之后就好了!
3.之后就是拍攝之后的返回處理了:
else if (requestCode == FROM_CAMERA) {//handle data from camera and set the background of your profile//這個就是當時設置的那個文件的路徑的,可以直接讀取到從存儲里面File pic = new File(Profile_Dir,"/"+getName()+ ".png");Log.e("TAG", "camera");//這個是這個進行了一個裁減,我把代碼貼在下面,是從網(wǎng)上找的,沒有問題,我一試就可以cropPhoto(Uri.fromFile(pic));public void cropPhoto(Uri uri) {Intent intent = new Intent("com.android.camera.action.CROP");intent.setDataAndType(uri, "image/*");intent.putExtra("crop", "true");// aspectX aspectY 是寬高的比例intent.putExtra("aspectX", 1);intent.putExtra("aspectY", 1);// outputX outputY 是裁剪圖片寬高intent.putExtra("outputX", 250);intent.putExtra("outputY", 250);intent.putExtra("return-data", true);startActivityForResult(intent, CROP_PIC);}4.裁減之后把圖片設置成頭像,也要處理跳轉(zhuǎn)回來的result
else if(requestCode==CROP_PIC){//set the pic thenBundle b=data.getExtras();Bitmap head=b.getParcelable("data");//設置頭像user_profile.setImageBitmap(head);//這里是把這個頭像保存起來,我也是保存在了SD卡中,替代了相加拍攝的那個照片Bit2File(head);}public void Bit2File(Bitmap bitmap){//照片路徑(你要保存的)File file=new File(Profile_Dir, "/"+getName()+".png");try {FileOutputStream out=new FileOutputStream(file);bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);out.flush();out.close();//上面是保存//下面是發(fā)送一個廣播告訴系統(tǒng)相冊更新Uri uri=Uri.fromFile(file);sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri));} catch (FileNotFoundException e) {e.printStackTrace();Log.e("TAG", "file_not found !");} catch (IOException e) {Log.e("TAG", "profile save fail!");e.printStackTrace();}}真的是這個搞了很久,什么也不懂嘛,就抄代碼,然后很痛苦的是網(wǎng)上信息太多了,有些也已經(jīng)不適合現(xiàn)在的版本了
我使用的是Vivo s10,有沒有也在搞這個的伙伴啊。
android開發(fā)真的里面的東西太多了,我只能慢慢的走。
希望這個項目能取得一個好的結(jié)果。
對了,我把截圖發(fā)一下:
?
?
?
?完,好晚了。
?
?
總結(jié)
以上是生活随笔為你收集整理的android 7.0之后的打开相机拍摄头像上传的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 线扫激光算法原理
- 下一篇: 联想笔记本电脑没声音,显卡驱动正常,驱动