티스토리 뷰

이 기능을 위해서 내부적으로 음원 파일을 가지고 설정을 하려고 했는데 용량 관계로 웹에서 파일을 불러와 벨소리 리스트에 추가하는 방법을 알아보자.

 다운로드 버튼을 눌렀을 경우 다운 버튼을 누른후 동작 


위의 화면에서 재생 버튼을 누르게 되면 아래와 같이 웹에 생성한 soundPool로 해당 주소의 파일을 불러와 벨소리 리스트위치에 다운이 되며 미디어 파일 검색을 해 줌으로써 알림음 리스트에 해당 음원이 추가가 된다.
여기서 주의할 점은 DOWNLOAD_PATH 경로와 다운이 완료 되었을 경우 리스트 갱신을 위해 "미디어 파일 검색"을 해 주는 아래 코드이다.

[알림음 리스트에 추가시]
	private static String DOWNLOAD_PATH = "/mnt/sdcard/media/audio/notifications/";


[벨소리 리스트에 추가시]
	private static String DOWNLOAD_PATH = "/mnt/sdcard/media/audio/ringtones/";


[미디어 파일 검색 코드]
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory())));


아래 전체소스를 참고해서 웹 음원파일을 재생하고 원하는 위치에 다운도 해 보자.

[MenuPlay.java 파일 전체내용 보기]

public class MenuPlay extends Activity {
    /** Called when the activity is first created. */
	private static SoundPool soundPool;
	private static int[] sound; 
	private static String TIP_POPUP_MSG = "웹에서 파일을 불러오는 중입니다.\n잠시만 기다려 주세요!";
	//private static String DOWN_POPUP_MSG = "다운을 시작합니다. 잠시만 기다려 주세요!";
	private static String DOWN_COMPLETED_POPUP_MSG = "해당 파일을 \"Media/Audio/Notifications\"에\n";
	private static String DOWN_FAIL_POPUP_MSG = "해당 파일을  다운로드 실패하였습니다.\n개발자에게 문의 바랍니다.";

	private static String DOWNLOAD_PATH = "/mnt/sdcard/media/audio/notifications/";

	private static String NOTI1_URL = "음원파일웹주소/음원파일명";
	private static String NOTI1_FILENAME = "저장될음원파일명";

	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
        //Title bar 제거
        requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.play);
		
		soundPool = new SoundPool(1, AudioManager.STREAM_MUSIC, 0 );
		sound = new int[1];
		sound[0] = soundPool.load(NOTI1_URL, 1);

		/* Play 버튼 동작시 수행됨 */
        Button Button_Play_Noti1 = (Button) findViewById(R.id.buttonPlay_noti1);
        
        Button_Play_Noti1.setOnClickListener(
    		new OnClickListener(){
    			public void onClick(View v){
    				if(playSound(0) == 0)
    				{
    					Toast.makeText(MenuPlay.this, TIP_POPUP_MSG, Toast.LENGTH_SHORT).show();
    				}
    			}
    		}
        );
        
        /* Download 버튼 동작시 수행됨 */
        Button Button_Down_Noti1 = (Button) findViewById(R.id.buttonDown_noti1);
        
        Button_Down_Noti1.setOnClickListener(
    		new OnClickListener(){
    			public void onClick(View v){
					try {
			            InputStream inputStream = new URL(NOTI1_URL).openStream();
			            
			            File path = new File(DOWNLOAD_PATH);
			            if(! path.isDirectory()) {
			            	path.mkdirs();
			            }
			            File file = new File(DOWNLOAD_PATH+NOTI1_FILENAME);
			            OutputStream out = new FileOutputStream(file);
			            saveRemoteFile(inputStream, out);
			            out.close();
			            Toast.makeText(MenuPlay.this, DOWN_COMPLETED_POPUP_MSG+NOTI1_FILENAME+" 이름으로 다운로드 하였습니다.", Toast.LENGTH_SHORT).show();
			            sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory())));
			        } catch(Exception e){
			        	Toast.makeText(MenuPlay.this, DOWN_FAIL_POPUP_MSG, Toast.LENGTH_SHORT).show();
			            e.printStackTrace();
			        }
    			}
    		}
        );
	
	public static int playSound(int i){
		return soundPool.play( sound[i], 1, 1, 0, 0, 1);  
	}
	
    public void saveRemoteFile(InputStream is, OutputStream os) throws IOException    
    {
        int c = 0;
        while((c = is.read()) != -1)
            os.write(c);
        os.flush();
		
	}
}


 

댓글