Android 에서 카메라 와 앨범 을 어떻게 사용 하 는 지 간단히 말씀 드 리 겠 습 니 다.

12219 단어 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()방법 에서 들 어 오 는 두 번 째 인자 입 니 다.
를 사용 하여 Uri 의 공유 경 로 를 지정 하 였 으 며 xml 자원 을 참조 하 였 습 니 다.
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 카드 읽 기 권한 신청 이 팝 업 됩 니 다.

사진 선택 후 효과:

이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기