Android Studio "코드 1행"학습-카메라 및 포토 앨범 호출
34252 단어 AndroidStudio
응용 프로그램에서 카메라를 호출하는 것은 매우 흔히 볼 수 있는 기능이다. 이제 학습의 길을 열어보자!
1. 레이아웃 파일 수정
activity 수정main.xml의 내용, 새 Button과 ImageView는 각각 사진을 찍고 표시하는 데 사용됩니다. 다음과 같습니다.
2.编写调用摄像头的具体逻辑
(1)获取Button和ImageView的实例,并注册button的点击事件,click后调用摄像头,具体处理逻辑如下:
- 创建file对象,存储拍下的图片
File outputImage = new File(getExternalCacheDir(), "output_image.jpg");
try {
if (outputImage.exists()) {
outputImage.delete();
}
outputImage.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
if(Build.VERSION.SDK_INT>=24){
imageUri=FileProvider.getUriForFile(MainActivity.this,
"com.example.cameraalbumtest.fileprovider",outputImage);
}else{
imageUri=Uri.fromFile(outputImage);
}
android.media.action.IMAGE_CAPTURE
로 지정하고putExtra 방법을 사용하여 그림 출력 주소를 지정합니다Intent intent=new Intent("android.media.action.IMAGE_CAPTURE");
intent.putExtra(MediaStore.EXTRA_OUTPUT,imageUri);
startActivityForResult(intent,TAKE_PHOTO);
Android7.0 시스템이 시작되면 로컬 실제 경로를 직접 사용하는 Uri가 이상을 던집니다. FileProvider는 특수한 내용 제공기로서 봉인된 Uri를 외부에 공유하여 안전성을 높일 수 있습니다.
(2) AndroidManifest에 등록 컨텐트 공급자가 있습니다.xml에 FileProvider 등록
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="com.example.cameraalbumtest.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"/>
</provider>
(3) onActivity Result () 방법에 그림의 시작 활동을 표시하면 이 방법으로 결과를 되돌려줍니다. BitmapFactory의 decodeStream () 방법을 호출하여 사진을 분석하고 ImageView에 표시합니다. 구체적인 코드는 다음과 같습니다.
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
switch (requestCode){
case TAKE_PHOTO:
if(resultCode==RESULT_OK){
try{
Bitmap bitmap=BitmapFactory.decodeStream
(getContentResolver().openInputStream(imageUri));
picture.setImageBitmap(bitmap);
}catch(FileNotFoundException e){
e.printStackTrace();
}
}
break;
default:
break;
}
}
(4) file 만들기paths.xml 파일, external-path를 인용하여 Uri 공유를 지정합니다. 그 중에서 path 속성은 구체적인 경로를 표시하고 빈 설명으로 설정하여 전체 SD 카드를 공유합니다.
<?xml version="1.0" encoding="utf-8" ?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path
name="my_images"
path="" />
</paths>
(5) 선언 권한 구성 파일에서 SD 카드 액세스 권한 선언
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.cameraalbumtest">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
...
</manifest>
Android4.4 시스템 이전에는 SD 카드의 어플리케이션 연결 디렉토리에 액세스하기 위해 선언 권한이 필요하지만 이후에는 필요하지 않음
3. 사소한 질문 하나
filepaths.xml 파일에서 path 속성 값을 공백으로 설정하면 "Value must not be empty"메시지가 빨간색으로 표시되지만 실행에 영향을 주지 않습니다.path = "/"을 설정하면 경로가 잘못되지 않습니다...
앨범
카메라를 사용해 사진을 찍는 것 외에 앨범에서 직접 사진을 선택하는 것이 흔히 사용되는데 다음은 앨범에서 사진을 선택하여 표시하는 것을 실현한다.
1. 레이아웃 파일 수정
앨범에서 사진을 선택할 수 있도록 button 추가
<Button
android:id="@+id/choose_from_album"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="choose photo"/>
2. 앨범을 호출하는 논리를 넣는다
(1) button 실례를 획득하고 클릭 이벤트를 등록하여 이벤트에서 실행 시 권한 신청을 하고 WRITE 획득EXTERNAL_STORAGE 권한, sd 카드에서 읽기 및 쓰기 가능
Button chooseFromAlbum=findViewById(R.id.choose_from_album);
chooseFromAlbum.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
}else{
openAlbum();
}
}
});
(2) 오픈 Album () 방법을 만들고 앨범 프로그램을 시작하여 이 방법에서 Intent를 구축하고 action을android로 지정합니다.intent.action.GET_CONTENT 코드는 다음과 같습니다.
private void openAlbum(){
Intent intent=new Intent("android.intent.action.GET_CONTENT");
intent.setType("image/*");
startActivityForResult(intent,CHOOSE_PHOTO);
}
(3) onActivityResult 방법에서 그림의 시작 활동을 처리한 후 CHOOSE 로 전송PHOTO 값, 이 방법에서 시스템 버전 판단을 하고 각각 다른 방법으로 그림을 처리한다
case CHOOSE_PHOTO:
if(resultCode==RESULT_OK){
//
if(Build.VERSION.SDK_INT>=19){
//4.4
handleImageOnKitKat(data);
}else{
//4.4
handleImageBeforeKitKat(data);
}
}
break;
안드로이드 시스템은 4.4 버전부터 그림을 선택하면 실제 Uri를 되돌려주지 않고 봉인하여 되돌려줍니다. 따라서 4.4 버전 이상의 시스템은 이 Uri를 분석해야 합니다.
(4)handleImageOnKitKat() 방법을 만들어 그림을 해석하고 Uri 유형을 먼저 판단하며 서로 다른 유형의uri에 대해 서로 다른 처리 방식을 취한 다음에 getImagePath 방법을 통해 그림 경로를 얻은 다음displayImage 방법으로 그림을 표시한다
@TargetApi(19)
private void handleImageOnKitKat(Intent data){
String imagePath=null;
Uri uri=data.getData();
if(DocumentsContract.isDocumentUri(this,uri)){
//document Uri
String docId=DocumentsContract.getDocumentId(uri);
if("com.android.providers.media.documents".equals(uri.getAuthority())){
String id=docId.split(":")[1];
String seletion=MediaStore.Images.Media._ID+"="+id;
imagePath=getImagePath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,seletion);
}else if("com.android.providers.downloads.documents".equals(uri.getAuthority())){
Uri contentUri= ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"),Long.valueOf(docId));
imagePath=getImagePath(contentUri,null);
}
}else if("content".equalsIgnoreCase(uri.getScheme())){
//content Uri
imagePath=getImagePath(uri,null);
}else if("file".equalsIgnoreCase(uri.getScheme())){
//file Uri,
imagePath=uri.getPath();
}
displayImage(imagePath);
}
Android API는 높은 버전의 일부 기능을 낮은 버전에서 사용할 수 없으며 오류가 발생할 수 있으므로 @TargetApi(19)를 사용하여 오류를 방지해야 합니다.
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;
}
private void displayImage(String imagePath){
if(imagePath!=null){
Bitmap bitmap=BitmapFactory.decodeFile(imagePath);
picture.setImageBitmap(bitmap);
}else{
Toast.makeText(this,"failed to get image",Toast.LENGTH_SHORT).show();
}
}
(5)handleImageBeforeKitKat 만들기 () 방법은 4.4 이하 버전 시스템의 그림을 처리합니다.Uri가 봉인되지 않았기 때문에 getImagePath 방법으로 그림 경로를 가져오고 디스플레이 Image 방법으로 그림을 표시하면 됩니다
private void handleImageBeforeKitKat(Intent data){
Uri uri=data.getData();
String imagePath=getImagePath(uri,null);
displayImage(imagePath);
}
이로써 카메라를 이용해 사진을 찍고 앨범에서 사진을 선택하는 데 성공했다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Android Studio에서 Material Icon을 빨리 캡처Android Studio 3.4 기능에 Resource Manager가 추가되었습니다. 이 Resource Manager를 사용하면 Material Icon을 앱에 쉽게 가져올 수 있습니다. Resource Man...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.