編輯:關於Android編程
android拍照或從相冊取圖片並裁剪,這個功能很常用,網上也有不少例子,可是很多之前的代碼已經都不好用了。這個可能與4.4之後,相冊返回的地址和原來不一樣有關系吧,下面是我的代碼,在nexus6中測試通過。
activity_album.xml布局文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior" tools:context="com.example.cg.cameralearn.AlbumActivity" tools:showIn="@layout/activity_album" android:orientation="vertical"> <ImageView android:id="@+id/img_album" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center"/> </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/menu_openCameral" android:title="打開相機" app:showAsAction="never" /> <item android:id="@+id/menu_openAlbum" android:title="打開相冊" app:showAsAction="never" /> </menu>
AlbumActivity.java
package com.example.cg.cameralearn; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.provider.MediaStore; import android.support.design.widget.FloatingActionButton; import android.support.design.widget.Snackbar; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.ImageView; import java.io.File; public class AlbumActivity extends AppCompatActivity { public static void AlbumActivityStart(Context context) { Intent intent = new Intent(); intent.setClass(context, AlbumActivity.class); context.startActivity(intent); } private ImageView img_album; // 拍照成功,讀取相冊成功,裁減成功 private final int ALBUM_OK = 1, CAMERA_OK = 2,CUT_OK = 3; private File file; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_album); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) .setAction("Action", null).show(); } }); // 定義拍照後存放圖片的文件位置和名稱,使用完畢後可以方便刪除 file = new File(Environment.getExternalStorageDirectory(), "temp.jpg"); file.delete();// 清空之前的文件 initControls(); } /** * 初始化控件 */ private void initControls() { img_album = (ImageView)findViewById(R.id.img_album); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_album, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); switch (id) { case R.id.menu_openCameral: //這裡被注掉的,是在6.0中進行權限判斷的,大家可以根據情況,自行加上 /*if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { //申請WRITE_EXTERNAL_STORAGE權限 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 123); Log.e("Album","我沒有權限啊"); }else { Log.e("Album","我有權限啊"); }*/ // 來自相機 Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); // 下面這句指定調用相機拍照後的照片存儲的路徑 cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file)); startActivityForResult(cameraIntent, CAMERA_OK);// CAMERA_OK是用作判斷返回結果的標識 break; case R.id.menu_openAlbum: // 來自相冊 Intent albumIntent = new Intent(Intent.ACTION_PICK, null); /** * 下面這句話,與其它方式寫是一樣的效果,如果: * intent.setData(MediaStore.Images.Media.EXTERNAL_CONTENT_URI); * intent.setType(""image/*");設置數據類型 * 要限制上傳到服務器的圖片類型時可以直接寫如:"image/jpeg 、 image/png等的類型" */ albumIntent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*"); startActivityForResult(albumIntent, ALBUM_OK); break; } return super.onOptionsItemSelected(item); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { System.out.println("requestCode = " + requestCode); switch (requestCode) { // 如果是直接從相冊獲取 case ALBUM_OK: //從相冊中獲取到圖片了,才執行裁剪動作 if (data != null) { clipPhoto(data.getData(),ALBUM_OK); //setPicToView(data); } break; // 如果是調用相機拍照時 case CAMERA_OK: // 當拍照到照片時進行裁減,否則不執行操作 if (file.exists()) { clipPhoto(Uri.fromFile(file),CAMERA_OK);//開始裁減圖片 } break; // 取得裁剪後的圖片,這裡將其設置到imageview中 case CUT_OK: /** * 非空判斷大家一定要驗證,如果不驗證的話, 在剪裁之後如果發現不滿意, * 要重新裁剪,丟棄 當前功能時,會報NullException */ if (data != null) { setPicToView(data); }else { Log.e("Main","data為空"); } break; default: break; } super.onActivityResult(requestCode, resultCode, data); } /** * 裁剪圖片方法實現 * @param uri 圖片uri * @param type 類別:相機,相冊 */ public void clipPhoto(Uri uri,int type) { Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(uri, "image/*"); // 下面這個crop = true是設置在開啟的Intent中設置顯示的VIEW可裁剪 intent.putExtra("crop", "true"); // aspectX aspectY 是寬高的比例,這裡設置的是正方形(長寬比為1:1) intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); // outputX outputY 是裁剪圖片寬高 intent.putExtra("outputX", 200); intent.putExtra("outputY", 200); intent.putExtra("return-data", false); /** * 此處做一個判斷 * 1,相機取到的照片,我們把它做放到了定義的目錄下。就是file * 2,相冊取到的照片,這裡注意了,因為相冊照片本身有一個位置,我們進行了裁剪後,要給一個裁剪後的位置, * 不然onActivityResult方法中,data一直是null */ if(type==CAMERA_OK) { intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); }else { intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file)); } startActivityForResult(intent, CUT_OK); } /** * 保存裁剪之後的圖片數據 將圖片設置到imageview中 * * @param picdata 資源 */ private void setPicToView(Intent picdata) { try { Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(picdata.getData())); img_album.setImageBitmap(bitmap); }catch (Exception ex) { ex.printStackTrace(); } } }
這個實例可以幫助我們學習旋轉動畫和計時器這兩個知識點,廢話不多說,上主程序: package com.bear.lotterywheel; import java.u
恰逢2014 Google I/O大會,不難看出安卓在Google的推進以及本身的開放性作用下,已經快延生到生活的各個方面了,從安卓智能手機、平板,到可穿戴的Androi
本文實例總結了Android編程中圖片特效處理方法。分享給大家供大家參考,具體如下:這裡介紹的Android圖片處理方法包括:轉換 - drawable To
上一篇已經帶大家實現了自由的放大縮小圖片,簡單介紹了下Matrix;具體請參考:Android實現手勢滑動多點觸摸縮放平移圖片效果,本篇繼續完善我們的ImageView。