반응형
오늘은 안드로이드 스튜디오에서 ExoPlayer를 이용해서 핸드폰 속의 동영상을 가져와서 동영상 재생을 시키거나
동영상을 찍은 후에 영상을 가져와서 재생을 시키는 것을 하겠습니다.
ExoPlayer 공식홈페이지 참조하여서 봐주세요~
https://exoplayer.dev/playlists.html
Playlists - ExoPlayer
exoplayer.dev
manifests 부터 시작을 하겠습니다 . 추가를 해주세요~
//// 외부 인터넷 uri를 통해서 받아오는 경우 아래 2개를 추가해주세요
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
build.gradle 추가하겠습니다 .
implementation "com.google.android.exoplayer:exoplayer-core:2.14.1"
implementation "com.google.android.exoplayer:exoplayer-ui:2.14.1"
implementation "com.google.android.exoplayer:exoplayer-hls:2.14.1"
xml을 만들겠습니다. 아주 간단하게 버튼 3개를 만들도록 하겠습니다 .
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="159dp"
android:layout_marginLeft="159dp"
android:layout_marginEnd="159dp"
android:layout_marginRight="159dp"
android:layout_marginBottom="161dp"
android:text="Button"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="159dp"
android:layout_marginEnd="159dp"
android:layout_marginBottom="112dp"
android:text="Button"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
메인 액티비티 입니다~
public class MainActivity extends AppCompatActivity {
Button button,button2;
String path;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = findViewById(R.id.button);
button2 = findViewById(R.id.button2);
//핸드폰에 저장되어있는 동영상을 가져올 때
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("video/*");
startActivityForResult(intent, 1); //startActivityForResult를 이용해서 가져온다.
}
});
//카메라로 영상을 찍어서 동영상을 재생하기
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent takeVideoIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
if (takeVideoIntent.resolveActivity(getPackageManager()) != null) {
startActivityForResult(takeVideoIntent, 2);
}
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode){
////핸드폰 내의 영상을 가져올 때
case 1:
if(resultCode==RESULT_OK){
//선택한 사진의 경로(Uri)객체 얻어오기
Uri uri= data.getData();
Log.d("path ", uri.toString());
path = getRealPathFromUri(uri); ////가져온 uri의 경로의 절대경로를 가져온다.
if(uri!=null){
if (uri.toString().contains("image")) {
////가져온 다음에 Second 액티비티로 이동을한다.
Intent intent =new Intent(MainActivity.this, Second.class);
intent.putExtra("uri", path);
startActivity(intent);
}else if(uri.toString().contains("video")) {
////가져온 다음에 Second 액티비티로 이동을한다.
Intent intent =new Intent(MainActivity.this, Second.class);
intent.putExtra("uri", path);
Log.d("path ", path);
startActivity(intent);
}
}
}
////카메라로 영상을 찍어서 가져올 때
case 2:
if(resultCode==RESULT_OK){
//선택한 사진의 경로(Uri)객체 얻어오기
Uri uri= data.getData();
Log.d("path ", uri.toString());
path = getRealPathFromUri(uri); ////가져온 uri의 경로의 절대경로를 가져온다.
Log.d("path ", path);
if(uri!=null){
if (uri.toString().contains("image")) {
////가져온 다음에 Second 액티비티로 이동을한다.
Intent intent =new Intent(MainActivity.this, Second.class);
intent.putExtra("uri", path);
startActivity(intent);
}else if (uri.toString().contains("video")) {
////가져온 다음에 Second 액티비티로 이동을한다.
Intent intent =new Intent(MainActivity.this, Second.class);
intent.putExtra("uri", path);
startActivity(intent);
}else{
}
}
}
}
}
////가져온 영상의 uri의 절대경로를 바꿔주는 메소드
String getRealPathFromUri(Uri uri){
String[] proj= {MediaStore.Images.Media.DATA};
CursorLoader loader= new CursorLoader(this, uri, proj, null, null, null);
Cursor cursor= loader.loadInBackground();
int column_index= cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
String result= cursor.getString(column_index);
cursor.close();
return result;
}
}
Second 액티비티 만들기.
Second 의 xml 입니다 .
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:padding="16dp"
android:layout_height="match_parent"
tools:context=".Second">
<com.google.android.exoplayer2.ui.PlayerView
android:id="@+id/pv"
android:layout_width="match_parent"
android:layout_height="300dp">
</com.google.android.exoplayer2.ui.PlayerView>
<com.google.android.exoplayer2.ui.PlayerControlView
android:id="@+id/pcv"
android:layout_width="match_parent"
android:layout_height="300dp"/>
</RelativeLayout>
Second 액티비티 입니다.
public class Second extends AppCompatActivity {
PlayerView pv;
//실제 비디오를 플레이하는 객체의 참조 변수
SimpleExoPlayer player;
//컨트롤러 뷰 참조 변수
PlayerControlView pcv;
Uri videoUri ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);\
pv=findViewById(R.id.pv);
pcv=findViewById(R.id.pcv);
//매인액티비티에서 intent 받아온 uri 값
Intent intent =getIntent();
String uri = intent.getStringExtra("uri");
//파싱을 해준다.
videoUri=Uri.parse(uri);
Log.d("path ", videoUri.toString());
}
//화면에 보이기 시작할때!!
@Override
protected void onStart() {
super.onStart();
//SimpleExoPlayer객체 생성
player = new SimpleExoPlayer.Builder(this.getApplicationContext()).build();
//플레이어뷰에게 플레이어 설정
pv.setPlayer(player);
//플레이어 컨트럴뷰와 플레이어 연동
pcv.setPlayer(player);
//비디오데이터 소스를 관리하는 DataSource 객체를 만들어주는 팩토리 객체 생성
DataSource.Factory factory= new DefaultDataSourceFactory(this,"Ex89VideoAndExoPlayer");
//비디오데이터를 Uri로 부터 추출해서 DataSource객체 (CD or LP판 같은 ) 생성
ProgressiveMediaSource mediaSource= new ProgressiveMediaSource.Factory(factory).createMediaSource(videoUri);
//만들어진 비디오데이터 소스객체인 mediaSource를
//플레이어 객체에게 전당하여 준비하도록!![ 로딩하도록 !!]
player.prepare(mediaSource);
//로딩이 완료되어 준비가 되었을 때
//자동 실행되도록..
//player.setPlayWhenReady(true);
}
//화면에 안보일 때..
@Override
protected void onStop() {
super.onStop();
//플레이어뷰 및 플레이어 객체 초기화
pv.setPlayer(null);
player.release();
player=null;
}
}
이상 exoplayer 간단 구현이었습니다!!
반응형
'안드로이드' 카테고리의 다른 글
[Android/Kotlin ]Exoplayer 동적 playlist 만들기 (0) | 2022.01.10 |
---|---|
Room 사용법 . (Room) (0) | 2022.01.06 |
안드로이드 부트페이 API 카카오결제 사용! (JAVA) (2) | 2021.11.18 |
안드로이드 스튜디오 네이버 파파고 api 사용해보기! (Java) (0) | 2021.11.17 |
FCM 토큰 이용해서 상대방에게 메세지 날리기 (feat.Retrofit) 3편 (0) | 2021.11.11 |