从相册打开照片
折騰了三個多小時,程序無Bug,但是就是打不開照片。。。
完全照著郭老師的代碼敲得。。。
版本不一樣,想打開郭老師源代碼,居然失敗。。。
還需要進一步折騰,
吃點飯,
回來繼續。
=============================
把郭老師的代碼粘過來,果然能用。。。
實在找不到不一樣的地方,先放放吧,將來會調試了在研究。
郭老師代碼:
1 package com.example.cameraalbumtest;
2
3 import android.Manifest;
4 import android.annotation.TargetApi;
5 import android.content.ContentUris;
6 import android.content.Intent;
7 import android.content.pm.PackageManager;
8 import android.database.Cursor;
9 import android.graphics.Bitmap;
10 import android.graphics.BitmapFactory;
11 import android.net.Uri;
12 import android.os.Build;
13 import android.os.Bundle;
14 import android.os.Environment;
15 import android.provider.DocumentsContract;
16 import android.provider.MediaStore;
17 import android.support.annotation.NonNull;
18 import android.support.v4.app.ActivityCompat;
19 import android.support.v4.content.ContextCompat;
20 import android.support.v4.content.FileProvider;
21 import android.support.v7.app.AppCompatActivity;
22 import android.util.Log;
23 import android.view.View;
24 import android.widget.Button;
25 import android.widget.ImageView;
26 import android.widget.Toast;
27
28 import java.io.File;
29 import java.io.FileNotFoundException;
30 import java.io.IOException;
31
32 public class MainActivity extends AppCompatActivity {
33 public static final int TAKE_PHOTO = 1;
34
35 public static final int CHOOSE_PHOTO = 2;
36
37 private ImageView picture;
38
39 private Uri imageUri;
40
41 @Override
42 protected void onCreate(Bundle savedInstanceState) {
43 super.onCreate(savedInstanceState);
44 setContentView(R.layout.activity_main);
45 Button takePhoto = (Button) findViewById(R.id.take_photo);
46 Button chooseFromAlbum = (Button) findViewById(R.id.choose_from_album);
47 picture = (ImageView) findViewById(R.id.picture);
48 takePhoto.setOnClickListener(new View.OnClickListener() {
49 @Override
50 public void onClick(View v) {
51 // 創建File對象,用于存儲拍照后的圖片
52 File outputImage = new File(getExternalCacheDir(), "output_image.jpg");
53 try {
54 if (outputImage.exists()) {
55 outputImage.delete();
56 }
57 outputImage.createNewFile();
58 } catch (IOException e) {
59 e.printStackTrace();
60 }
61 if (Build.VERSION.SDK_INT < 24) {
62 imageUri = Uri.fromFile(outputImage);
63 } else {
64 imageUri = FileProvider.getUriForFile(MainActivity.this, "com.example.cameraalbumtest.fileprovider", outputImage);
65 }
66 // 啟動相機程序
67 Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
68 intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
69 startActivityForResult(intent, TAKE_PHOTO);
70 }
71 });
72 chooseFromAlbum.setOnClickListener(new View.OnClickListener() {
73 @Override
74 public void onClick(View v) {
75 if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
76 ActivityCompat.requestPermissions(MainActivity.this, new String[]{ Manifest.permission. WRITE_EXTERNAL_STORAGE }, 1);
77 } else {
78 openAlbum();
79 }
80 }
81 });
82 }
83
84 private void openAlbum() {
85 Intent intent = new Intent("android.intent.action.GET_CONTENT");
86 intent.setType("image/*");
87 startActivityForResult(intent, CHOOSE_PHOTO); // 打開相冊
88 }
89
90 @Override
91 public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
92 switch (requestCode) {
93 case 1:
94 if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
95 openAlbum();
96 } else {
97 Toast.makeText(this, "You denied the permission", Toast.LENGTH_SHORT).show();
98 }
99 break;
100 default:
101 }
102 }
103
104 @Override
105 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
106 switch (requestCode) {
107 case TAKE_PHOTO:
108 if (resultCode == RESULT_OK) {
109 try {
110 // 將拍攝的照片顯示出來
111 Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));
112 picture.setImageBitmap(bitmap);
113 } catch (Exception e) {
114 e.printStackTrace();
115 }
116 }
117 break;
118 case CHOOSE_PHOTO:
119 if (resultCode == RESULT_OK) {
120 // 判斷手機系統版本號
121 if (Build.VERSION.SDK_INT >= 19) {
122 // 4.4及以上系統使用這個方法處理圖片
123 handleImageOnKitKat(data);
124 } else {
125 // 4.4以下系統使用這個方法處理圖片
126 handleImageBeforeKitKat(data);
127 }
128 }
129 break;
130 default:
131 break;
132 }
133 }
134
135 @TargetApi(19)
136 private void handleImageOnKitKat(Intent data) {
137 String imagePath = null;
138 Uri uri = data.getData();
139 Log.d("TAG", "handleImageOnKitKat: uri is " + uri);
140 if (DocumentsContract.isDocumentUri(this, uri)) {
141 // 如果是document類型的Uri,則通過document id處理
142 String docId = DocumentsContract.getDocumentId(uri);
143 if("com.android.providers.media.documents".equals(uri.getAuthority())) {
144 String id = docId.split(":")[1]; // 解析出數字格式的id
145 String selection = MediaStore.Images.Media._ID + "=" + id;
146 imagePath = getImagePath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, selection);
147 } else if ("com.android.providers.downloads.documents".equals(uri.getAuthority())) {
148 Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(docId));
149 imagePath = getImagePath(contentUri, null);
150 }
151 } else if ("content".equalsIgnoreCase(uri.getScheme())) {
152 // 如果是content類型的Uri,則使用普通方式處理
153 imagePath = getImagePath(uri, null);
154 } else if ("file".equalsIgnoreCase(uri.getScheme())) {
155 // 如果是file類型的Uri,直接獲取圖片路徑即可
156 imagePath = uri.getPath();
157 }
158 displayImage(imagePath); // 根據圖片路徑顯示圖片
159 }
160
161 private void handleImageBeforeKitKat(Intent data) {
162 Uri uri = data.getData();
163 String imagePath = getImagePath(uri, null);
164 displayImage(imagePath);
165 }
166
167 private String getImagePath(Uri uri, String selection) {
168 String path = null;
169 // 通過Uri和selection來獲取真實的圖片路徑
170 Cursor cursor = getContentResolver().query(uri, null, selection, null, null);
171 if (cursor != null) {
172 if (cursor.moveToFirst()) {
173 path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
174 }
175 cursor.close();
176 }
177 return path;
178 }
179
180 private void displayImage(String imagePath) {
181 if (imagePath != null) {
182 Bitmap bitmap = BitmapFactory.decodeFile(imagePath);
183 picture.setImageBitmap(bitmap);
184 } else {
185 Toast.makeText(this, "failed to get image", Toast.LENGTH_SHORT).show();
186 }
187 }
188
189 }
總結
- 上一篇: 如何向这些CA来申请数字证书呢?
- 下一篇: 鲲鹏性能优化十板斧——鲲鹏处理器NUMA