android studio之簡單呼叫攝像頭並且獲取其照片
阿新 • • 發佈:2019-01-09
1.首先讓我們來理清一下其中的邏輯:拍一張照片,獲取其路徑,根據路徑進行展示。2.好了我們已經理清好邏輯了:那我們就想如何實現,首先我們要實現一個app呼叫拍照功能,很簡單,我們學過用一個活動呼叫另一個活動的intent,很明顯是有的,然後我們要如何讓拍到的照片返回到我們的app呢,還記得intent有一個putExtra的功能對吧,它用於傳輸資料,但是它在啟動一個攝像頭媒體的時候作用就不同了,它會根據傳輸進去的不同鍵值而發揮不同的作用,而設定圖片路徑就是其中一個,它還有其他不同的功能,例如設定圖片大小等,需要的可以自己去查,但這個鍵值需求第二個引數為一個uri,那麼我們可以自己新建一個檔案,並且生成它的uri,這樣不就可以了嗎?這個檔案新建在哪裡也是一個問題,android為我們提供了一個叫做app關聯快取目錄的東西,那我們存在哪裡可以了。下面給出具體程式碼。3.程式碼:1.主活動
2.主佈局:package com.example.gdzc.cameraalbumtest; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; import android.os.Build; import android.provider.MediaStore; import android.support.v4.content.FileProvider; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.ImageView; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; public class MainActivity extends AppCompatActivity { public static final int TAKE_POTHO=1; private ImageView imageView; private Button button; private Uri uri; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); imageView=(ImageView)findViewById(R.id.picture); button=(Button)findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { File outImage=new File(getExternalCacheDir(),"output_image.jpg"); try{ if(outImage.exists()) { outImage.delete(); } outImage.createNewFile(); } catch (IOException e) { e.printStackTrace(); } if(Build.VERSION.SDK_INT>=24) { uri= FileProvider.getUriForFile(MainActivity.this,"com.example.gdzc.cameraalbumtest.fileprovider",outImage); } else { uri=Uri.fromFile(outImage); } Intent intent=new Intent("android.media.action.IMAGE_CAPTURE"); intent.putExtra(MediaStore.EXTRA_OUTPUT,uri); startActivityForResult(intent,TAKE_POTHO); } }); } @Override protected void onActivityResult(int requestCode,int resultCode,Intent data) { switch (requestCode) { case TAKE_POTHO: if(resultCode==RESULT_OK) { try{ Bitmap bitmap= BitmapFactory.decodeStream(getContentResolver().openInputStream(uri)); imageView.setImageBitmap(bitmap); }catch (FileNotFoundException e) { e.printStackTrace(); } } break; default: break; } } }
3.登錄檔:<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:id="@+id/button" android:text="Button" android:layout_width="match_parent" android:layout_height="wrap_content" /> <ImageView android:layout_gravity="center_horizontal" android:id="@+id/picture" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
4.共享路徑的檔案:<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.gdzc.cameraalbumtest"> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>//關聯目錄的許可權 <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <provider android:authorities="com.example.gdzc.cameraalbumtest.fileprovider"//必須與生成時uri的第二個引數相同 android:name="android.support.v4.content.FileProvider"//固定格式 android:exported="false" android:grantUriPermissions="true"> <meta-data//用於指定具體的共享路徑 android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths">//還沒有要我們自己建 </meta-data> </provider> </application> </manifest>
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path
name="12"
path="">//若為空那麼就共享整個sd卡,也可以寫具體的我們新建檔案的路徑
</external-path>
</paths>