Android 에서 카메라 와 앨범 을 어떻게 사용 하 는 지 간단히 말씀 드 리 겠 습 니 다.
1.카메라 호출
레이아웃 파일:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<!-- -->
<Button android:id="@+id/open_photo"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text=" "
/>
<!-- -->
<ImageView
android:id="@+id/img"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
/>
</LinearLayout>
활성 클래스 코드:
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
public static final int OPEN_PHOTO_REQUEST_CODE = 1;
private Uri imgUrl = null;
private ImageView imageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 【 】
findViewById(R.id.open_photo).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
File file = new File(getExternalCacheDir(), "imageView.jpg");//
if (file.exists()) {
file.delete();
}
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
if (Build.VERSION.SDK_INT >= 24) {// 7.0
imgUrl = FileProvider.getUriForFile(MainActivity.this, "net.deniro.camera.fileProvider", file);
} else {
imgUrl = Uri.fromFile(file);
}
//
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
intent.putExtra(MediaStore.EXTRA_OUTPUT, imgUrl);//
startActivityForResult(intent, OPEN_PHOTO_REQUEST_CODE);
}
});
//
imageView = (ImageView) findViewById(R.id.img);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.d(TAG, "requestCode: " + requestCode);
Log.d(TAG, "imgUrl: " + imgUrl);
switch (requestCode) {
case OPEN_PHOTO_REQUEST_CODE:
if (resultCode == RESULT_OK) {
try {//
Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imgUrl));
imageView.setImageBitmap(bitmap);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
break;
default:
break;
}
}
}
getExternalCacheDir()는 현재 캐 시 데 이 터 를 저장 하 는 데 사용 되 는 SD 카드 의 위 치 를 가 져 올 수 있 습 니 다.Android 6.0+를 시작 으로 SD 카드 에 저 장 된 다른 디 렉 터 리 를 읽 는 것 은 모두 위험한 권한 으로 분 류 돼 있 기 때문에 실행 시 권한 을 설정 해 야 작 동 할 수 있 으 며,여기 에는 응용 프로그램 과 연 결 된 디 렉 터 리 가 사용 되 기 때문에 이 단 계 를 건 너 뛸 수 있 습 니 다.getUriForFile()방법 은 세 개의 인 자 를 받 습 니 다.Context 대상,임의의 유일한 문자열 과 File 대상 입 니 다.안 드 로 이 드 7.0+시스템 부터 로 컬 의 실제 경 로 를 직접 사용 하 는 것 은 안전 하지 않 은 것 으로 여 겨 집 니 다.FileExposedException 이상 을 던 집 니 다.FileProvider 는 특수 한 콘 텐 츠 제공 기 입 니 다.콘 텐 츠 제공 기와 유사 한 체 제 를 사용 하여 데 이 터 를 보호 합 니 다.
AndroidManifest.xml 에 정 의 된 콘 텐 츠 제공 자 를 등록 합 니 다.
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="net.deniro.camera.fileProvider"
android:exported="false"
android:grantUriPermissions="true">
<!-- Uri -->
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
android:authorities 는 우리 가 FileProvider.getUriForFile()방법 에서 들 어 오 는 두 번 째 인자 입 니 다.IDEA 에 서 는 단축 키 ctrl+enter 를 통 해 xml 폴 더 에 직접 파일 을 만 들 수 있 습 니 다.
바로 만 들 기
기본 xml 폴 더
file_paths.xml:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Uri -->
<!--name: ( )-->
<!--path: , SD -->
<external-path name="img" path=""/>
</PreferenceScreen>
Android 4.4 이전 에는 SD 카드 응용 프로그램 에 접근 할 수 있 는 관련 디 렉 터 리 권한 을 설정 해 야 합 니 다.
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
촬영 후 효과:2 앨범 에서 사진 선택
앨범 에서 기 존 사진 한 장 을 직접 선택 하 는 것 이 카 메 라 를 켜 고 사진 한 장 을 찍 는 것 보다 더 자주 사용 되 기 때문에 좋 은 앱 은 이 두 가지 방식 을 모두 실현 해 야 한다.
레이아웃 파일 을 수정 하고[앨범 열기]단 추 를 추가 합 니 다:
<!-- -->
<Button
android:id="@+id/choose_photo"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text=" "
/>
이벤트 클래스 에 앨범 을 열 고 사진 을 선택 하 는 처리 논 리 를 추가 합 니 다.
/**
*
*/
public static final int CHOOSE_PHOTO_REQUEST_CODE = 2;
...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
...
//
findViewById(R.id.choose_photo).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
CHOOSE_PHOTO_REQUEST_CODE);
} else {
openAlbum();
}
}
});
/**
*
*/
private void openAlbum() {
Intent intent = new Intent("android.intent.action.GET_CONTENT");
intent.setType("image/*");
startActivityForResult(intent, CHOOSE_PHOTO_REQUEST_CODE);
}
/**
* WRITE_EXTERNAL_STORAGE
*
* SD , SD
*
* WRITE_EXTERNAL_STORAGE SD
* @param requestCode
* @param permissions
* @param grantResults
*/
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode) {
case CHOOSE_PHOTO_REQUEST_CODE:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
openAlbum();
} else {
Toast.makeText(this, " ", Toast.LENGTH_SHORT).show();
}
break;
default:
break;
}
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.d(TAG, "requestCode: " + requestCode);
Log.d(TAG, "imgUrl: " + imgUrl);
switch (requestCode) {
case OPEN_PHOTO_REQUEST_CODE:
if (resultCode == RESULT_OK) {
try {//
Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imgUrl));
imageView.setImageBitmap(bitmap);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
break;
case CHOOSE_PHOTO_REQUEST_CODE:
if (Build.VERSION.SDK_INT >= 19) {//4.4
handleFor4_4(data);
} else {
handleForBefore4_4(data);
}
break;
default:
break;
}
}
/**
*
* android 4.4-
*
* @param data
*/
private void handleForBefore4_4(Intent data) {
display(getImagePath(data.getData(),null));
}
/**
*
* android 4.4+
*
* @param data
*/
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
private void handleFor4_4(Intent data) {
String imagePath = null;
Uri uri = data.getData();//
if (DocumentsContract.isDocumentUri(this, uri)) {// Document , document id
String documentId = DocumentsContract.getDocumentId(uri);
String mediaDocumentAuthority = "com.android.providers.media.documents";
String downloadDocumentAuthority = "com.android.providers.downloads.documents";
if (mediaDocumentAuthority.equals(uri.getAuthority())) {//media
String id = documentId.split(":")[1];// ID
String selection = MediaStore.Images.Media._ID + "=" + id;
imagePath = getImagePath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, selection);
} else if (downloadDocumentAuthority.equals(uri.getAuthority())) {
Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(documentId));
imagePath = getImagePath(contentUri, null);
}
} else if ("content".equalsIgnoreCase(uri.getScheme())) {//content uri
imagePath = getImagePath(uri, null);
} else if ("file".equalsIgnoreCase(uri.getScheme())) {//file ,
imagePath = uri.getPath();
}
display(imagePath);
}
/**
*
* @param path
*/
private void display(String path) {
if(path==null){
Toast.makeText(this, " ", Toast.LENGTH_SHORT).show();
}else{
imageView.setImageBitmap(BitmapFactory.decodeFile(path));
}
}
/**
*
*
* @param uri
* @param selection
* @return
*/
private String getImagePath(Uri uri, String selection) {
String path = null;
Cursor cursor = getContentResolver().query(uri, null, selection, null, null);
if (cursor != null) {
if (cursor.moveToFirst()) {
path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
}
cursor.close();
}
return path;
}
여기에 WRITE 를 요 청 했 습 니 다.EXTERNAL_STORAGE 권한 은 앨범 에 있 는 사진 이 일반적으로 SD 카드 에 저 장 된 줄 알 았 기 때문에 SD 카드 에서 사진 을 읽 으 려 면 신청 권한 이 필요 합 니 다.WRITE_EXTERNAL_STORAGE 는 SD 카드 를 읽 고 쓰 는 능력 권한 을 표시 합 니 다.새 버 전의 휴대 전화(안 드 로 이 드 4.4 를 분수령 으로 함)를 호 환 하기 위해 안 드 로 이 드 4.4+버 전이 되 돌아 오 는 우리 가 해석 해 야 사용 할 수 있 기 때문이다.
[앨범 열기]단 추 를 누 르 면 SD 카드 읽 기 권한 신청 이 팝 업 됩 니 다.
사진 선택 후 효과:
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.