-
Notifications
You must be signed in to change notification settings - Fork 0
/
camera.java
161 lines (143 loc) · 6.45 KB
/
camera.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
package com.example.intentpractice;
import android.Manifest;
import android.app.Activity;
import android.content.ContentValues;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import java.io.IOException;
public class camera extends AppCompatActivity {
Uri imgUri; //用來參照拍照存檔的 Uri 物件
ImageView imv; //用來參照 ImageView 物件
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_camera); //注意要設定對!
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);//設定螢幕不隨手機旋轉
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//設定螢幕直向顯示
imv = (ImageView)findViewById(R.id.imageView); //參照 Layout 中的 ImageView 元件
}
public void goBack(View d){
try {
Toast.makeText(camera.this, "welcome back to home page", Toast.LENGTH_SHORT).show();
setResult(920);
finish();
}
catch(Exception e){
Toast.makeText(camera.this,e.toString(),Toast.LENGTH_SHORT).show();
}
}
public void onGet(View v) {
if (ActivityCompat.checkSelfPermission(this, //檢查是否已取得寫入權限
Manifest.permission.WRITE_EXTERNAL_STORAGE) !=
PackageManager.PERMISSION_GRANTED) {
//尚未取得權限
ActivityCompat.requestPermissions(this, //向使用者要求允許寫入權限
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
200);
}
else {
//已經取得權限
savePhoto(); //拍照並存檔
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if (requestCode == 200){
if (grantResults[0] == PackageManager.PERMISSION_GRANTED){ //使用者允許權限
savePhoto(); //拍照並存檔
}
else { //使用者拒絕權限
Toast.makeText(this, "程式需要寫入權限才能運作", Toast.LENGTH_SHORT).show();
}
}
}
private void savePhoto () {
imgUri = getContentResolver().insert(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
new ContentValues());
Intent it = new Intent("android.media.action.IMAGE_CAPTURE");
it.putExtra(MediaStore.EXTRA_OUTPUT, imgUri); //將 uri 加到拍照 Intent 的額外資料中
startActivityForResult(it, 100);
}
public void onPick(View v) {
Intent it = new Intent(Intent.ACTION_GET_CONTENT); //動作設為 "選取內容"
it.setType("image/*"); //設定要選取的媒體類型為:所有類型的圖片
startActivityForResult(it, 101); //啟動意圖, 並要求傳回選取的圖檔
}
protected void onActivityResult (int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(resultCode == Activity.RESULT_OK) { //要求的意圖成功了
switch(requestCode) {
case 100: //拍照
Intent it = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, imgUri);//設為系統共享媒體檔
sendBroadcast(it);
break;
case 101: //選取相片
imgUri = data.getData(); //取得選取相片的 Uri
break;
}
imv.setScaleType(ImageView.ScaleType.FIT_XY);
showImg(); //顯示 imgUri 所指明的相片
}
else {
Toast.makeText(this, requestCode==100? "沒有拍到照片":
"沒有選取相片", Toast.LENGTH_LONG)
.show();
}
}
void showImg() {
int iw, ih, vw, vh;
boolean needRotate; //用來儲存是否需要旋轉
BitmapFactory.Options option = new BitmapFactory.Options(); //建立選項物件
option.inJustDecodeBounds = true; //設定選項:只讀取圖檔資訊而不載入圖檔
//讀取圖檔資訊存入 Option 中
try {
BitmapFactory.decodeStream(getContentResolver().openInputStream(imgUri), null, option);
}
catch (IOException e) {
Toast.makeText(this, "讀取照片資訊時發生錯誤", Toast.LENGTH_LONG).show();
return;
}
iw = option.outWidth; //由 option 中讀出圖檔寬度
ih = option.outHeight; //由 option 中讀出圖檔高度
vw = imv.getWidth(); //取得 ImageView 的寬度
vh = imv.getHeight(); //取得 ImageView 的高度
int scaleFactor;
if(iw<ih) { //如果圖片的寬度小於高度
needRotate = false; //不需要旋轉
scaleFactor = Math.min(iw/vw, ih/vh); // 計算縮小比率
}
else {
needRotate = true; //需要旋轉
scaleFactor = Math.min(iw/vh, ih/vw); // 將 ImageView 的寬、高互換來計算縮小比率
}
option.inJustDecodeBounds = false; //關閉只載入圖檔資訊的選項
option.inSampleSize = scaleFactor; //設定縮小比例, 例如 2 則長寬都將縮小為原來的 1/2
//載入圖檔
Bitmap bmp = null;
try {
bmp = BitmapFactory.decodeStream(getContentResolver().openInputStream(imgUri), null, option);
} catch (IOException e) {
Toast.makeText(this, "無法取得照片", Toast.LENGTH_LONG).show();
}
if(needRotate) { //如果需要旋轉
Matrix matrix = new Matrix(); //建立 Matrix 物件
matrix.postRotate(90); //設定旋轉角度
bmp = Bitmap.createBitmap(bmp , //用原來的 Bitmap 產生一個新的 Bitmap
0, 0, bmp.getWidth(), bmp.getHeight(), matrix, true);
}
imv.setImageBitmap(bmp); //顯示圖片
}
}