'Android'에 해당되는 글 37건

  1. 2013.02.20 Android - ImageView 동적 추가
  2. 2013.02.04 Android - Video ( 동영상촬영 용량제한 시간제한 ) (1)
  3. 2013.01.29 Android - 리스트뷰에 스피너 형태 달기 (ListView Spinner) (6)
  4. 2013.01.28 Android - ProgressBar를 이용한 Recorder 만들기 (녹음기) (2)
  5. 2012.03.07 Android - 여가가지 Intent 활용 (1)

Android - ImageView 동적 추가

Android 2013.02.20 20:50

 

 

이미지뷰나 버튼 등 앱 구동 중에 생성이 필요한 때가 있습니다.

 

그때 동적으로 생성 추가하는 구문 입니다.

 

필요하실때 약간 수정해서 쓰시면 될것 같습니다.

 

예시 예문은 ImageView 동적추가 구문입니다.

 

 

ImageView iv = new ImageView(this);
iv.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
iv.setBackgroundResource(이미지);
추가할레이아웃.addView(iv);

 

 

간단한 추가 예시 구문입니다.

 

여기에 이미지뷰에 필요한 위치나 패딩 값등 을 주어서 생성 할 수 있습니다.

 

예제는 생략하겠습니다.

저작자 표시
신고
Trackback 1 : Comment 0

Write a comment


Android - Video ( 동영상촬영 용량제한 시간제한 )

Android 2013.02.04 14:07

안녕하세요 ~

오늘은 동영상 촬영을 할 때 시간제한용량제한을 거는 프로젝트를 해보겠습니다.

 

채팅어플이나 기타 동영상촬영 어플을 봤을 때 제한된 용량을 벗어나면 보낼 수 없게 되는데요.

보낼 수 있게 제한을 걸어 두는 방법이라고 생각하시면 되겠네요.

 

자신이 원하는 시간만큼이나 자신이 원하는 용량만큼 동영상 촬영이 되고 자신이 원하는 디렉토리에 저장되는 것을 해보겠습니다.

 

필요한 세가지를 보고 넘어 가겠습니다.

 

첫번째 시간제한

intent.putExtra(MediaStore.EXTRA_DURATION_LIMIT, 시간적는 곳);

 

두번째 용량제한

intent.putExtra(MediaStore.EXTRA_SIZE_LIMIT, (long) (용량적는 곳));

 

세번째 저장할 파일디렉토리

intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, 파일디렉토리경로적는 곳);

 

필요한 인자 값을 원하는 값으로 넣어서 실행해 주시면 되겠습니다.

 

 

프로젝트는 버튼 하나만 추가하고 내장 카메라를 불러와 동영상 촬영을 하되 제한을 걸어 실행해보겠습니다.

이프로젝트에서는 시간은 9999로 맞쳐놓고 용량 4메라고 맞쳐서 용량이 되면 자동적으로 촬영을 멈추고 저장하는 화면으로 넘어가는 것을 살펴보겠습니다.

 

 

 

프로젝트명 : videoexam1

패키지명 : com.example.videoexam1

클래스파일 : Page_main

XML파일 : page_main

타겟 : 2.2 ~ 4.2

추가할퍼미션 :    

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.CAMERA"/>

 

 

Page_main.java

 

Page_main.java

 

package com.example.videoexam1;

import android.os.Bundle;
import android.provider.MediaStore;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.widget.Button;

public class Page_main extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.page_main);

Button bt1 = (Button) findViewById(R.id.button1);
bt1.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub

//내장카메라 호출
Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
//동영상 품질
intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 0);
//동영상 시간 제한
intent.putExtra(MediaStore.EXTRA_DURATION_LIMIT, 111);// 시간
//동영상 용량 제한
intent.putExtra(MediaStore.EXTRA_SIZE_LIMIT, (long) (1024 * 1024 * 4));// 용량
//동영상 저장 경로
String mImageMovieUri = "/sdcard/Download/exam/";
intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT,
mImageMovieUri);
startActivityForResult(intent, 2);

}
});

}

}

 

page_main.xml

 

page_main.xml

 

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".Page_main" >

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:text="Button" />

</RelativeLayout>

 

 

실행화면

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

정해진 용량만큼 촬영되고 종료되는 것을 볼 수 있습니다.

 

많은 응용 바랍니다. 문의는 댓글로 ~

 

 

 

저작자 표시
신고
Trackback 1 : Comment 1
  1. 2014.07.05 23:46 신고 Modify/Delete Reply

    좋은 정보 감사해요 안드로이드에 관한 글이 많네요^^
    잘활용하겠습니다.

Write a comment


Android - 리스트뷰에 스피너 형태 달기 (ListView Spinner)

Android 2013.01.29 00:26

안녕하세요 오늘만 두번째 글이네요.

아니 하루가 지났으니 오늘 첫번째 글이 되는건가요.

 

어떤분이 리스트뷰에 스피너처럼 뛰울 수는 없는가 해서 제가 한번 해보았습니다.

리스트뷰에 동적으로 스피너를 구현해보았지만 모습이 영.........아니더라구요 ㅎ

그래서 생각한방법이 다이얼로그를 스피너형태처럼 뛰우는 형식을 썼습니다.

 

 

오랜만에 이리저리 소스만지다보니 헤매다가 예전 자료 찾아서 쓱싹 해치웠네요 ㅎ

그 분에게 도움이 될지는 모르겠지만 제가 한 방법을 소개하겠습니다.

 

 

현재 리스트뷰 구현 방법은 전 글을 찾아보시면 쉽게 해보실 수 있구요.

그 구현 소스에 간단히 다이얼로그 생성 소스만 갖다 붙힌 걸로 쉽게 구현할 수 있었습니다.

다이얼로그를 따로 메소드를 만들어서 하시는 분들도 있지만 저는 리스트뷰 클릭 동시에 다이얼로그를 생성하는 방식으로 구현했습니다.

 

 

방법은 아래와 같습니다.

 

먼저 각 행에 뿌려줄 문자값을 배열로 지정합니다.

String[] Example = new String[]{"깡통" ,"중옵" ,"풀옵"};
  
다이얼로그객체생성
 new AlertDialog.Builder(this)

 

타이틀은 없애구요
.setTitle("")
 

아이템에 넣어줄 것은 뿌려줄 문자값과 클릭 시 이벤트 처리입니다.

.setItems(Example, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
이 부분에 int 값으로 이벤트처리 하시면 됩니다 !

     }
})

 

버튼은 당연히 스피너인데 없어야겠지요.
 .setNegativeButton("", null)
.show();

 

 

이 구문을 추가함으로써 리스트뷰를 클릭 시 스피너 형태처럼 구현할 수 있도록 하였습니다.

다이얼로그 생성 구문을 알아두면 어디든 써먹을 수 있다는 장점이 있습니다. 여러분도 메모장 같은 곳에 적어두고 잘 써먹으시길 바라겠습니다.

이제 소스와 실행화면으로 맞치겠습니다.

필요한 설명은 주석으로 달아놓았습니다. 그 외의 질문은 댓글로 !!!!

 

 

프로젝트 생성

 

프로젝트명 : com.jsh.examlistspiner

클래스파일 : ListviewSpiner

XML파일 : main.xml

타겟 : 2.2 ~ 4.2

 

 

 

ListviewSpinner.java

 

ListviewSpiner.txt

 

package com.example.com.jsh.examlistspiner;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.widget.ListView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.RelativeLayout;
import android.widget.Spinner;
import android.widget.TextView;
import android.view.View;

//OnItemClickListener 인터페이스 상속
public class ListviewSpinner extends Activity implements OnItemClickListener {

// 리스트뷰에 보여질 문자열 배열로 할당
String[] age = new String[] { "아방", "슴삼", "아써", "크삼" };

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

// 리소스 파일에 정의된 id_list 라는 ID 의 리스트뷰를 얻는다.
ListView list = (ListView) findViewById(R.id.listView1);

// ArrayAdapter 객체를 생성한다.
ArrayAdapter<String> adapter;

// 리스트뷰가 보여질 아이템 리소스와 문자열 정보를 저장한다
// 객체명 = new ArrayAdapter<데이터형>(참조할메소드, 보여질아이템리소스, 보여질문자열);
adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, age);

/*
*
* 안드로이드에서 제공하는 기본적인 리스트뷰 아이템 리소스
*
* simple_list_item_1 simple_list_item_2 simple_list_item_activated_1
* simple_list_item_activated_2 simple_list_item_checked
* simple_list_item_multiple_choice simple_list_item_single_choice
* simple_selectable_list_item
*/


// 리스트뷰에 ArrayAdapter 객체를 설정하여 리스트뷰에 데이터와 출력 형태를 지정한다.
list.setAdapter(adapter);

// 리스트뷰 선택 시 이벤트를 설정한다.
list.setOnItemClickListener(this);
}

// 리스트뷰 선택 시 이벤트 처리 메소드
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
// TODO Auto-generated method stub
// arg1는 현재 리스트에 뿌려지고 있는 정보
// arg2는 현재 리스트에 뿌려지고 있는 해당 id 값

// 다이얼로그에 보여질 내용
String[] Example = new String[] { "깡통", "중옵", "풀옵" };

// 다이얼로그 생성
new AlertDialog.Builder(this).setTitle("")
.setItems(Example, new DialogInterface.OnClickListener() {

@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub

// int 값으로 switch문으로 분기 치면 됩니다.

}
}).setNegativeButton("", null).show();

}

}

 

 

main.xml

 

main.txt

 

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/layout"
    tools:context=".ListviewSpiner" >

    <ListView
        android:id="@+id/listView1"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
       >
    </ListView>

</RelativeLayout>

 

 

 

실행화면

 

 

 

 

 

 

 

이런식으로 리스트뷰 클릭 시

스피너 형태로 구현되도록 하였습니다.

 

많이 찾아주세요.

 

 

 

 

저작자 표시
신고
Trackback 0 : Comments 6
  1. ssima 2013.01.29 09:09 신고 Modify/Delete Reply

    잘 보고가요! 덕분에 많은 도움이 되었습니다. 감사합니다. 정님!! -씨마 올림-

  2. wooruang 2013.02.18 22:50 신고 Modify/Delete Reply

    딱 필요했던 부분인데 잘보고 갑니다 감사함니다~^^

  3. 질문 2013.02.28 14:25 신고 Modify/Delete Reply

    처음 리스트 에서......깡통, 중옵, 풀옵 이 나올때....
    짧게 클릭인가요?? 길게 클릭인가요??
    혹시 짧게 클릭햇을때...... 다른 엑티비티(다른 화면) 으로 넘어가게 할 수 있나요??
    (예시 : 카톡의 설정화면에서 각 해당 아이템 클릭시 화면이동....)
    혹시..... 샘플 있으신가요?? 있으시면 메일로좀 부탁드립니다.
    test000@hanmail.net 로 부탁드립니다......

    • 정승현 2013.02.28 21:15 신고 Modify/Delete

      현재 보시는 소스에서 inItemClick 메소드에서 int arg1 부분의 arg1을 통해서 분기쳐서 다른 액티비티로 넘기시면 됩니다.

Write a comment


Android - ProgressBar를 이용한 Recorder 만들기 (녹음기)

Android 2013.01.28 17:47

 

안녕하세요 오랜만에 글을 쓰게되었습니다. 만 1년이 지나갔나요?

개발자로 일을 하다가 잠시 다른일에 허덕이다가 지금은 백수.......... 현재 다시 공부중입니다 하하 ㅡㅡ;;

 

개발쪽일은 취미로 할까 생각해요 ㅎ 저녁에 조금씩 java쪽을 공부하고 있네요 ㅎ

이제는 Android 뿐만 아니라 Web도 다루게 될 것 같습니다 !

 

다들 화이팅 하십시요 !

 

 

오늘은 프로그래스바를 이용한 녹음기를 만들어보겠습니다.

기초적인 것이구요 . 이것을 토대로 채팅에 필요한 음성메세지 구현을 했었습니다.

 

이 프로젝트를 응용하여 적용시키는 것은 여러분의 몫입니다 . 기초적인 프로그래스 이용 녹음기 설명 시작하겠습니다.

 

대부분 필요한 내용은 주석 처리로 설명을 대신하였구요 살펴볼 내용만 몇가지 집고 소스 첨부하겠습니다.

 

 

녹음기 말 그대로 말을 녹음한뒤에 다시 듣는 것이지요.

이것을 프로그래스바를 이용하여서 진행하는 정도와 듣기 시 내가 얼마나 들었는지를 표시하여 사용의 편함을 추가한 것이지요.

 

UI 변경을 위해서 Handler를 이용했습니다.

Handler가 아니면 동시에 UI를 변경할 수 없기에 백그라운드에서 돌리기 위함입니다. 하지만 다른 방법도 있겠지요?

 


 

mRecorder.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR);

 

이부분 setOutputFormat은 파일이 생성될 때 포맷을 정해주는 역활을 합니다. 이것을 바꿔줌으로써 아이폰과 동시에 쓸 수 있게 포맷을 바꿔주던가 자신이 원하는 포맷으로 파일을 생성할 수 있습니다.

 

mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);

 

파일의 인코더를 어떤식으로 해줄 것인가를 정해주는 것입니다. DEFAULT 무난하게 !


mRecorder.setOutputFile(mFilePath + mFileName);

 

마지막으로 녹음이 되어지는 파일을 어떠한경로에 생성을 하느냐에 대한 문장이지요.

변수로 설정하였기에 mFilePath 파일 경로 / mFileName 파일 명 이 되겠습니다. 직접 적어주셔도되고 저처럼 한번 선언한 수 가져다가 쓰셔도 좋습니다. 후자가 편합니다.

 

 

그리구 중요한 한가지 uses-permission 부분입니다.

이 프로젝트에서 안드로이드폰에서 저장소와 오디오 부분을 사용하기 때문에 그 부분을 사용하기 위한 허락?을 받아야죠?

Permission에서 두가지를 설정해 주세요.

먼저 오디오를 사용하기 위해 android.permission.RECORD_AUDIO

저장소를 사용하기 위해 android.permission.WRITE_EXTERNAL_STORAGE 두가지를 설정하셔야 합니다.

 

 

제가 생각했던 부분은 이정도 이구요. 빠뜨린 부분이 있다면 주석으로 처리해두셔서 보기 어렵지 않으실거라 생각합니다.

 

 

앗! 그리고 프로젝트 생성이 바뀌었더군요 ㅎ

알아서 잘들 하실거라 생각합니다. 제가 설정한 몇가지만 적겠습니다.

 

 

 

프로젝트 생성

 

패키지 : com.jsh.examrecorder

클래스명 : ProgressRecorder

XML파일명 : main

타겟은 : 2.2 ~ 4.2

 

 

ProgressRecorder.java 

ProgressRecorder.txt

 

package com.example.com.jsh.examrecorder;


import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import android.app.Activity;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;

public class ProgressRecorder extends Activity implements View.OnClickListener, OnCompletionListener
{

// 미리 상수 선언
  private static final int REC_STOP = 0;
  private static final int RECORDING = 1;
  private static final int PLAY_STOP = 0;
  private static final int PLAYING = 1;
  private static final int PLAY_PAUSE = 2;
 
  private MediaRecorder mRecorder = null;
  private MediaPlayer mPlayer = null;
  private int mRecState = REC_STOP;
  private int mPlayerState = PLAY_STOP;
  private SeekBar mRecProgressBar, mPlayProgressBar;
  private Button mBtnStartRec, mBtnStartPlay, mBtnStopPlay;
  private String mFilePath, mFileName = null;
  private TextView mTvPlayMaxPoint;
 
  private int mCurRecTimeMs = 0;
  private int mCurProgressTimeDisplay = 0;
 
  // 녹음시 SeekBar처리
  Handler mProgressHandler = new Handler()
  {
    public void handleMessage(Message msg)
    {
      mCurRecTimeMs = mCurRecTimeMs + 100;
      mCurProgressTimeDisplay = mCurProgressTimeDisplay + 100;
     
      // 녹음시간이 음수이면 정지버튼을 눌러 정지시켰음을 의미하므로
      // SeekBar는 그대로 정지시키고 레코더를 정지시킨다.
      if (mCurRecTimeMs < 0)
      {}
      // 녹음시간이 아직 최대녹음제한시간보다 작으면 녹음중이라는 의미이므로
      // SeekBar의 위치를 옮겨주고 0.1초 후에 다시 체크하도록 한다.
      else if (mCurRecTimeMs < 20000)
      {
        mRecProgressBar.setProgress(mCurProgressTimeDisplay);
        mProgressHandler.sendEmptyMessageDelayed(0, 100);
      }
      // 녹음시간이 최대 녹음제한 시간보다 크면 녹음을 정지 시킨다.
      else
      {
        mBtnStartRecOnClick();
      }
    }
  };
 
  // 재생시 SeekBar 처리
  Handler mProgressHandler2 = new Handler()
  {
    public void handleMessage(Message msg)
    {
      if (mPlayer == null) return;
     
      try
      {
        if (mPlayer.isPlaying())
        {
          mPlayProgressBar.setProgress(mPlayer.getCurrentPosition());
          mProgressHandler2.sendEmptyMessageDelayed(0, 100);
        }
      }
      catch (IllegalStateException e)
      {}
      catch (Exception e)
      {}
    }
  };
 
  @Override
  public void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
   
    // 미디어 레코더 저장할 파일 생성
    mFilePath = "/sdcard/Download/";
   
    // 파일명을 년도월일시간분초 로 생성 겹치는 상황 없애기
    SimpleDateFormat timeStampFormat = new SimpleDateFormat(
"yyyyMMddHHmmss");
   
    // 파일명 위에서 정한 파일명을 WJ 폴더에 저장
    mFileName = "/WJ"
+ timeStampFormat.format(new Date()).toString()
+ "Rec.mp4";
   
    mBtnStartRec = (Button) findViewById(R.id.btnStartRec);
    mBtnStartPlay = (Button) findViewById(R.id.btnStartPlay);
    mBtnStopPlay = (Button) findViewById(R.id.btnStopPlay);
    mRecProgressBar = (SeekBar) findViewById(R.id.recProgressBar);
    mPlayProgressBar = (SeekBar) findViewById(R.id.playProgressBar);
    mTvPlayMaxPoint = (TextView) findViewById(R.id.tvPlayMaxPoint);
   
    mBtnStartRec.setOnClickListener(this);
    mBtnStartPlay.setOnClickListener(this);
    mBtnStopPlay.setOnClickListener(this);
  }
 
  // 버튼의 OnClick 이벤트 리스너
  public void onClick(View v)
  {
    switch(v.getId())
    {
      case R.id.btnStartRec:
        mBtnStartRecOnClick();
        break;
      case R.id.btnStartPlay:
        mBtnStartPlayOnClick();
        break;
      case R.id.btnStopPlay:
        mBtnStopPlayOnClick();
        break;
      default:
        break;
    }
  }
 
  private void mBtnStartRecOnClick()
  {
    if (mRecState == REC_STOP)
    {
      mRecState = RECORDING;
      startRec();
      updateUI();
    }
    else if (mRecState == RECORDING)
    {
      mRecState = REC_STOP;
      stopRec();
      updateUI();
    }
  }
 
  // 녹음시작
  private void startRec()
  {
    mCurRecTimeMs = 0;
    mCurProgressTimeDisplay = 0;
   
    // SeekBar의 상태를 0.1초후 체크 시작
    mProgressHandler.sendEmptyMessageDelayed(0, 100);
   
    if (mRecorder == null)
    {
      mRecorder = new MediaRecorder();
      mRecorder.reset();
    }
    else
    {
      mRecorder.reset();
    }
   
    try
    {
   
    //오디오 파일 생성
      mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
      mRecorder.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR);
      mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
      mRecorder.setOutputFile(mFilePath + mFileName);
      mRecorder.prepare();
      mRecorder.start();
    }
    catch (IllegalStateException e)
    {
      Toast.makeText(this, "IllegalStateException", 1).show();
    }
    catch (IOException e)
    {
      Toast.makeText(this, "IOException", 1).show();
    }
  }
 
  // 녹음정지
  private void stopRec()
  {
    try
    {
      mRecorder.stop();
    }
    catch(Exception e){
   
    }
    finally
    {
      mRecorder.release();
      mRecorder = null;
    }
   
    mCurRecTimeMs = -999;
    // SeekBar의 상태를 즉시 체크 
    mProgressHandler.sendEmptyMessageDelayed(0, 0);
  }
 
  private void mBtnStartPlayOnClick()
  {
    if (mPlayerState == PLAY_STOP)
    {
      mPlayerState = PLAYING;
      initMediaPlayer();
      startPlay();
      updateUI();
    }
    else if (mPlayerState == PLAYING)
    {
      mPlayerState = PLAY_PAUSE;
      pausePlay();
      updateUI();
    }
    else if (mPlayerState == PLAY_PAUSE)
    {
      mPlayerState = PLAYING;
      startPlay();
      updateUI();
    }
  }
  private void mBtnStopPlayOnClick()
  {
    if (mPlayerState == PLAYING || mPlayerState == PLAY_PAUSE)
    {
      mPlayerState = PLAY_STOP;
      stopPlay();
      releaseMediaPlayer();
      updateUI();     
    }
  }
 
  private void initMediaPlayer()
  {
    // 미디어 플레이어 생성
    if (mPlayer == null)
      mPlayer = new MediaPlayer();
    else
      mPlayer.reset();
   
    mPlayer.setOnCompletionListener(this);
    String fullFilePath = mFilePath + mFileName;
   
    try
    {
      mPlayer.setDataSource(fullFilePath);
      mPlayer.prepare();  
      int point = mPlayer.getDuration();
      mPlayProgressBar.setMax(point);
     
      int maxMinPoint = point / 1000 / 60;
      int maxSecPoint = (point / 1000) % 60;
      String maxMinPointStr = "";
      String maxSecPointStr = "";
     
      if (maxMinPoint < 10)
        maxMinPointStr = "0" + maxMinPoint + ":";
      else
        maxMinPointStr = maxMinPoint + ":";
     
      if (maxSecPoint < 10)
        maxSecPointStr = "0" + maxSecPoint;
      else
        maxSecPointStr = String.valueOf(maxSecPoint);
     
      mTvPlayMaxPoint.setText(maxMinPointStr + maxSecPointStr);
     
      mPlayProgressBar.setProgress(0);
    }
    catch(Exception e)
    {
      Log.v("ProgressRecorder", "미디어 플레이어 Prepare Error ==========> " + e);
    }
  }
 
  // 재생 시작
  private void startPlay()
  {
    Log.v("ProgressRecorder", "startPlay().....");
   
    try
    {
      mPlayer.start();
     
      // SeekBar의 상태를 0.1초마다 체크     
      mProgressHandler2.sendEmptyMessageDelayed(0, 100);
    }
    catch (Exception e)
    {
      e.printStackTrace();
      Toast.makeText(this, "error : " + e.getMessage(), 0).show();
    }
  }
 
  private void pausePlay()
  {
    Log.v("ProgressRecorder", "pausePlay().....");
   
    // 재생을 일시 정지하고
    mPlayer.pause();
   
    // 재생이 일시정지되면 즉시 SeekBar 메세지 핸들러를 호출한다.
    mProgressHandler2.sendEmptyMessageDelayed(0, 0);
  }
 
  private void stopPlay()
  {
    Log.v("ProgressRecorder", "stopPlay().....");
   
    // 재생을 중지하고
    mPlayer.stop();
   
    // 즉시 SeekBar 메세지 핸들러를 호출한다.
    mProgressHandler2.sendEmptyMessageDelayed(0, 0);
  }
 
  private void releaseMediaPlayer()
  {
    Log.v("ProgressRecorder", "releaseMediaPlayer().....");
    mPlayer.release();
    mPlayer = null;
    mPlayProgressBar.setProgress(0);
  }
 
  public void onCompletion(MediaPlayer mp)
  {
    mPlayerState = PLAY_STOP; // 재생이 종료됨

    // 재생이 종료되면 즉시 SeekBar 메세지 핸들러를 호출한다.
    mProgressHandler2.sendEmptyMessageDelayed(0, 0);
   
    updateUI();
  }
 
  private void updateUI()
  {
    if (mRecState == REC_STOP)
    {
      mBtnStartRec.setText("Rec");
      mRecProgressBar.setProgress(0);
    }
    else if (mRecState == RECORDING)
      mBtnStartRec.setText("Stop");
   
    if (mPlayerState == PLAY_STOP)
    {
      mBtnStartPlay.setText("Play");
      mPlayProgressBar.setProgress(0);
    }
    else if (mPlayerState == PLAYING)
      mBtnStartPlay.setText("Pause");
    else if (mPlayerState == PLAY_PAUSE)
      mBtnStartPlay.setText("Start");
  }
}

 

main.xml

 

 

 

 

 

main.txt

 

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#06000b" >
<!-- progress bar -->
<LinearLayout
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:gravity="center_vertical|center_horizontal"
  android:background="@null">
  <SeekBar
   android:id="@+id/recProgressBar"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:layout_gravity="center_vertical|center_horizontal"
   android:max="60000"
   android:padding="10dp"
   android:progress="0"/>
 
  <RelativeLayout
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:gravity="center_vertical"
      android:orientation="vertical"
      android:background="@null">

   <TextView
    android:id="@+id/tvRecStartPoint"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_vertical|left"
    android:layout_alignParentLeft="true"
    android:textSize="12sp"
    android:textColor="#FFFFFF"
    android:text="00:00"
    />
   <TextView
    android:id="@+id/tvRecMaxPoint"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_vertical|right"
    android:layout_alignParentRight="true"
    android:textSize="12sp"
    android:textColor="#FFFFFF"
    android:text="00:20"
    />
  </RelativeLayout>
</LinearLayout>

<LinearLayout
  android:orientation="horizontal"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:gravity="center_vertical|center_horizontal"
  android:background="@null">
  <Button
      android:id="@+id/btnStartRec"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:textSize="14sp"
      android:text="Rec" />
</LinearLayout>


<!-- progress bar -->
<LinearLayout
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:gravity="center_vertical|center_horizontal"
  android:background="@null">
  <SeekBar
   android:id="@+id/playProgressBar"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:layout_gravity="center_vertical|center_horizontal"
   android:max="60000"
   android:padding="10dp"
   android:progress="0"/>
 
  <RelativeLayout
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:gravity="center_vertical"
      android:orientation="vertical"
      android:background="@null">

   <TextView
    android:id="@+id/tvPlayStartPoint"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_vertical|left"
    android:layout_alignParentLeft="true"
    android:textSize="12sp"
    android:textColor="#FFFFFF"
    android:text="00:00"
    />
   <TextView
    android:id="@+id/tvPlayMaxPoint"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_vertical|right"
    android:layout_alignParentRight="true"
    android:textSize="12sp"
    android:textColor="#FFFFFF"
    android:text="01:00"
    />
  </RelativeLayout>
</LinearLayout>

<LinearLayout
  android:orientation="horizontal"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:gravity="center_vertical|center_horizontal"
  android:background="@null">
  <Button
      android:id="@+id/btnStartPlay"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:textSize="14sp"
      android:text="Play" />
  <Button
      android:id="@+id/btnStopPlay"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:textSize="14sp"
      android:text="Stop" />
</LinearLayout>
</LinearLayout>

 

 

실행결과

 

 

 

 

 

 

 

 

 

 

 

실행결과 화면이구요.

제가 개발 했을때 보다 환경이 바뀌었네요 ㅎㅎ

소리는 직접 하셔서 들어보셔요 !

문의는 댓글로 부탁드립니다.

저작자 표시
신고
Trackback 0 : Comments 2
  1. HJ_Reden 2015.02.24 13:45 신고 Modify/Delete Reply

    안녕하세요~~ 코드 감사합니다!!
    궁금한게 있는데요ㅠㅠ
    녹음을 시작했는데 00:00은 왜 안올라가는걸까요?

  2. HJ_Reden 2015.02.24 13:45 신고 Modify/Delete Reply

    안녕하세요~~ 코드 감사합니다!!
    궁금한게 있는데요ㅠㅠ
    녹음을 시작했는데 00:00은 왜 안올라가는걸까요?

Write a comment


Android - 여가가지 Intent 활용

Android 2012.03.07 17:06

원문 : http://dislab.hufs.ac.kr/wiki/Android/Intent_%EC%82%AC%EC%9A%A9_%EC%98%88

내장 프로그램 띄우기

웹페이지 띄우기

Uri uri = Uri.parse("http://www.google.com");
Intent it  = new Intent(Intent.ACTION_VIEW,uri);
startActivity(it);

구글맵 띄우기

Uri uri = Uri.parse("geo:38.899533,-77.036476");
Intent it = new Intent(Intent.Action_VIEW,uri);
startActivity(it);


구글 길찾기 띄우기

Uri uri = Uri.parse("http://maps.google.com/maps?f=d&saddr=출발지주소&daddr=도착지주소&hl=ko");
Intent it = new Intent(Intent.ACTION_VIEW,URI);
startActivity(it);


SMS/MMS 발송

Intent it = new Intent(Intent.ACTION_VIEW);   
it.putExtra("sms_body", "The SMS text");   
it.setType("vnd.android-dir/mms-sms");   
startActivity(it);  
 
 
// SMS 발송
Uri uri = Uri.parse("smsto:0800000123");   
Intent it = new Intent(Intent.ACTION_SENDTO, uri);   
it.putExtra("sms_body", "The SMS text");   
startActivity(it);  
 
 
// MMS 발송
Uri uri = Uri.parse("content://media/external/images/media/23");   
Intent it = new Intent(Intent.ACTION_SEND);   
it.putExtra("sms_body", "some text");   
it.putExtra(Intent.EXTRA_STREAM, uri);   
it.setType("image/png");   
startActivity(it);


이메일 발송

Uri uri = Uri.parse("mailto:xxx@abc.com");
Intent it = new Intent(Intent.ACTION_SENDTO, uri);
startActivity(it);
 
 
Intent it = new Intent(Intent.ACTION_SEND);   
it.putExtra(Intent.EXTRA_EMAIL, "me@abc.com");   
it.putExtra(Intent.EXTRA_TEXT, "The email body text");   
it.setType("text/plain");   
startActivity(Intent.createChooser(it, "Choose Email Client"));  
 
 
Intent it = new Intent(Intent.ACTION_SEND);     
String[] tos = {"me@abc.com"};     
String[] ccs = {"you@abc.com"};     
it.putExtra(Intent.EXTRA_EMAIL, tos);     
it.putExtra(Intent.EXTRA_CC, ccs);     
it.putExtra(Intent.EXTRA_TEXT, "The email body text");     
it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text");     
it.setType("message/rfc822");     
startActivity(Intent.createChooser(it, "Choose Email Client"));   
 
 
// extra 추가하기
Intent it = new Intent(Intent.ACTION_SEND);   
it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text");   
it.putExtra(Intent.EXTRA_STREAM, "file:///sdcard/mysong.mp3");   
sendIntent.setType("audio/mp3");   
startActivity(Intent.createChooser(it, "Choose Email Client"));
 
 
// 첨부파일을 추가하여 메일 보내기
Intent it = new Intent(Intent.ACTION_SEND);  
it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text");  
it.putExtra(Intent.EXTRA_STREAM, "file:///sdcard/eoe.mp3");  
sendIntent.setType("audio/mp3");  
startActivity(Intent.createChooser(it, "Choose Email Client"));


설치 어플 제거

Uri uri = Uri.fromParts("package", strPackageName, null);   
Intent it = new Intent(Intent.ACTION_DELETE, uri);   
startActivity(it);


APK파일을 통해 제거하기

Uri uninstallUri = Uri.fromParts("package", "xxx", null);
returnIt = new Intent(Intent.ACTION_DELETE, uninstallUri);
 
 
// APK파일 설치
Uri installUri = Uri.fromParts("package", "xxx", null);
returnIt = new Intent(Intent.ACTION_PACKAGE_ADDED, installUri);



마켓에서 어플리케이션 검색

Uri uri = Uri.parse("market://search?q=pname:pkg_name");  
Intent it = new Intent(Intent.ACTION_VIEW, uri);  
startActivity(it);  
// 패키지명은 어플리케이션의 전체 패키지명을 입력해야 합니다.
 
 
// 마켓 어플리케이션 상세 화면
Uri uri = Uri.parse("market://details?id=어플리케이션아이디");  
Intent it = new Intent(Intent.ACTION_VIEW, uri);  
startActivity(it);
// 아이디의 경우 마켓 퍼블리싱사이트의 어플을 선택후에 URL을 확인해보면 알 수 있습니다.


구글 검색

Intent intent = new Intent();
intent.setAction(Intent.ACTION_WEB_SEARCH);
intent.putExtra(SearchManager.QUERY,"searchString");

장치 사용

Camera

Intent intent2 = new Intent("android.media.action.IMAGE_CAPTURE");
imgUri = Uri.fromFile(photofile);
intent2.putExtra(MediaStore.EXTRA_OUTPUT, imgUri);
startActivityForResult(intent2, 1);


Video

Intent i = new Intent("android.media.action.VIDEO_CAPTURE");
i.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, Uri.fromFile(videofile));
i.putExtra(android.provider.MediaStore.EXTRA_VIDEO_QUALITY, 0);
i.putExtra("android.intent.extra.durationLimit", 60);
startActivityForResult(i, 2);


Audio

Intent i = new Intent("android.provider.MediaStore.RECORD_SOUND");

음악 파일 재생

Uri playUri = Uri.parse("file:///sdcard/download/everything.mp3");
returnIt = new Intent(Intent.ACTION_VIEW, playUri);


미디어파일 플레이 하기

Intent it = new Intent(Intent.ACTION_VIEW);
Uri uri = Uri.parse("file:///sdcard/song.mp3");
it.setDataAndType(uri, "audio/mp3");
startActivity(it);
 
 
Uri uri = Uri.withAppendedPath(
  MediaStore.Audio.Media.INTERNAL_CONTENT_URI, "1");   
Intent it = new Intent(Intent.ACTION_VIEW, uri);   
startActivity(it);


전화 걸기

Uri uri = Uri.parse("tel:xxxxxx");
Intent it = new Intent(Intent.ACTION_DIAL, uri);  
startActivity(it);  
 
 
Uri uri = Uri.parse("tel.xxxxxx");
Intent it = new Intent(Intent.ACTION_CALL,uri);
// 퍼미션을 잊지 마세요. <uses-permission id="android.permission.CALL_PHONE" />
 
원문 : http://www.jopenbusiness.com/tc/oss/entry/Android-Intent-%ED%99%9C%EC%9A%A9-%EC%82%AC%EB%A1%80

연락처 Intent

  • 연락처 조회
intent = new Intent(Intent.ACTION_VIEW, 
Uri.parse("content://contacts/people/" +
String.valueOf(contact.getId())));
startActivity(intent);
  • 연락처 등록
intent = new Intent(Intent.ACTION_INSERT, 
Uri.parse("content://contacts/people"));
startActivity(intent);
  • 연락처 수정
intent = new Intent(Intent.ACTION_EDIT, 
Uri.parse("content://contacts/people/" +
String.valueOf(contact.getId())));
startActivity(intent);
  • 연락처 삭제
intent = new Intent(Intent.ACTION_DELETE, 
Uri.parse("content://contacts/people/" +
String.valueOf(contact.getId())));
startActivity(intent);

전화 Intent

  • 권한 설정 (AndroidManifest.xml)
전화 걸기         : CALL_PHONE = "android.permission.CALL_PHONE"
긴급 통화  : CALL_PRIVILEGED =
"android.permission.CALL_PRIVILEGED"
폰 상태 읽기  : READ_PHONE_STATE =
"android.permission.READ_PHONE_STATE"
폰 상태 수정  : MODIFY_PHONE_STATE =
"android.permission.MODIFY_PHONE_STATE"
브로드케스팅 수신 : PROCESS_OUTGOING_CALLS =
"android.permission.PROCESS_OUTGOING_CALLS"
전화 걸기 이전  : ACTION_NEW_OUTGOING_CALL =
"android.intent.action.NEW_OUTGOING_CALL"
  • 전화걸기 화면
Intent intent = new Intent(Intent.ACTION_DIAL, 
Uri.parse("tel:" + TelNumber));
startActivity(intent);
  • 전화걸기
Intent intent = new Intent(Intent.ACTION_CALL, 
Uri.parse("tel:" + TelNumber));
startActivity(intent);

SMS Intent

  • 권한 설정 (AndroidManifest.xml)
수신 모니터링       : RECEIVE_SMS = "android.permission.RECEIVE_SMS"
읽기 가능  : READ_SMS = "android.permission.READ_SMS"
발송 가능  : SEND_SMS = "android.permission.SEND_SMS"
SMS Provider로 전송 : WRITE_SMS = "android.permission.WRITE_SMS"
 : BROADCAST_SMS = "android.permission.BROADCAST_SMS"
  • SMS 발송 화면
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.putExtra("sms_body", "The SMS text");
intent.setType("vnd.android-dir/mms-sms");
startActivity(intent);
  • SMS 보내기
Intent intent = new Intent(Intent.ACTION_SENDTO, 
Uri.parse("smsto://" + contact.getHandphone()));
intent.putExtra("sms_body", "The SMS text");
intent.setType("vnd.android-dir/mms-sms");
startActivity(intent);

이메일 Intent

  • 이메일 발송 화면
Intent intent = new Intent(Intent.ACTION_SENDTO, 
Uri.parse("mailto:" + contact.getEmail()));
startActivity(intent);

브라우저 Intent

  • Browser에서 URL 호출하기
new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.google.com/"));
startActivity(intent);
  • 브라우저에서 검색
Intent intent = new Intent(Intent.ACT ION_WEB_SEARCH);
intent.putExtra(SearchManager.QUERY, "검색어");
startActivity(intent);

지도 Intent

  • 지도 보기
Uri uri = Uri.parse ("geo: 38.00, -35.03");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);

안드로이드 마켓 Intent

  • 안드로이드 마켓에서 Apps 검색
Uri uri = Uri.parse("market://search?q=pname:전제_패키지_명");  
//--- 예) market://search?q=pname:com.jopenbusiness.android.smartsearch
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
  • 안드로이드 마켓의 App 상세 화면
Uri uri = Uri.parse("market://details?id=전제_패키지_명");
//--- 예) market://details?id=com.jopenbusiness.android.smartsearch
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);

갤럭시S의 Intent

  • 패키지명과 클래스명으로 App 호출
intent = new Intent(Intent.ACTION_MAIN);
intent.setComponent(new ComponentName("패키지명", "전체_클래스명"));
startActivity(intent);
  • 전화, SMS
  • 전화번호부 : com.android.contacts, com.sec.android.app.contacts.PhoneBookTopMenuActivity
  • 전화 : com.sec.android.app.dialertab, com.sec.android.app.dialertab.DialerTabActivity
  • 최근기록 : com.sec.android.app.dialertab, com.sec.android.app.dialertab.DialerTabDialerActivity
  • 메시지 : com.sec.mms, com.sec.mms.Mms
  • 이메일 : com.android.email, com.android.email.activity.Welcome
  • 일정 : com.android.calendar, com.android.calendar.LaunchActivity
  • 인터넷 : com.android.browser, com.android.browser.BrowserActivity
  • Google의 Android용 앱
  • 검색 : com.google.android.googlequicksearchbox, com.google.android.googlequicksearchbox.SearchActivity
  • 음성 검색 : com.google.android.voicesearch, com.google.android.voicesearch.RecognitionActivity
  • Gmail : com.google.android.gm, com.google.android.gm.ConversationListActivityGmail
  • 지도 : com.google.android.apps.maps, com.google.android.maps.MapsActivity
  • 위치찾기 : com.google.android.apps.maps, com.google.android.maps.LatitudeActivity
  • YouTube : com.google.android.youtube, com.google.android.youtube.HomeActivity
  • 토크 : com.google.android.talk, com.google.android.talk.SigningInActivity
  • Goggles : com.google.android.apps.unveil, com.google.android.apps.unveil.CaptureActivity
  • Google 번역 : com.google.android.apps.translate, com.google.android.apps.translate.HomeActivity
  • Reader : com.google.android.apps.reader, com.google.android.apps.unveil.CaptureActivity
  • Voice : com.google.android.apps.googlevoice, com.google.android.apps.googlevoice.SplashActivity
  • Google 별지도 : com.google.android.stardroid, com.google.android.stardroid.activities.SplashScreenActivity
  • 카메라 : com.sec.android.app.camera, com.sec.android.app.camera.Camera
  • TV : com.sec.android.app.dmb, com.sec.android.app.dmb.activity.DMBFullScreenView
  • Android 관리
  • 환경 설정 : com.android.settings, com.android.settings.Settings
  • 작업 관리자 : com.sec.android.app.controlpanel, com.sec.android.app.controlpanel.activity.JobManagerActivity
  • 마켓 : com.android.vending, com.android.vending.AssetBrowserActivity
저작자 표시
신고
Trackback 1 : Comment 1
  1. YJT 2012.05.04 13:12 신고 Modify/Delete Reply

    ^^ 완전 전문가시군요..

Write a comment