編輯:關於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();
}
}
}
Android之實現“抽獎大輪盤”
這個實例可以幫助我們學習旋轉動畫和計時器這兩個知識點,廢話不多說,上主程序: package com.bear.lotterywheel; import java.u
手機Android音視頻采集與直播推送,實現單兵、移動監控類應用
恰逢2014 Google I/O大會,不難看出安卓在Google的推進以及本身的開放性作用下,已經快延生到生活的各個方面了,從安卓智能手機、平板,到可穿戴的Androi
Android編程中圖片特效處理方法小結
本文實例總結了Android編程中圖片特效處理方法。分享給大家供大家參考,具體如下:這裡介紹的Android圖片處理方法包括:轉換 - drawable To
Android實現手勢滑動多點觸摸縮放平移圖片效果(二)
上一篇已經帶大家實現了自由的放大縮小圖片,簡單介紹了下Matrix;具體請參考:Android實現手勢滑動多點觸摸縮放平移圖片效果,本篇繼續完善我們的ImageView。