마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

브로드캐스트리시버 & 다운로드매니저

0 추천

브로드캐스트리시버를 이용해서

웹에서 파일을 다운받을 경우 다운로드매니저를 통해서 다운을 받는데

다운로드 완료 이벤트를 캐치하고싶은데 어디가 문제인지... log를 남겨봐도

부팅 로그는 나오는데 잘모르겠네요 ㅠ 제발 도와주실분 없으신가요..

=========================================================

manifest.xml

<uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

<receiver android:name="com.example.final_test.Broadcast" >
            <intent-filter android:priority="9999" >
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="android.intent.action.DOWNLOAD_COMPLETE" />
               
            </intent-filter>
        </receiver>

 

Broadcast.class

public class Broadcast extends BroadcastReceiver {
 
    @Override
    public void onReceive(Context context, Intent intent) {
     Log.d("My Tag","리시버 호출");
        if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())){
            Log.d("My Tag","부팅완료");
        }
        if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(intent.getAction())){
            Log.d("My Tag","다운완료");
             }
    }
}

MainActivity.class

public class MainActivity extends Activity {
 
 BroadcastReceiver myReceiver = new Broadcast();
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
 
  IntentFilter intentFilter = new IntentFilter(Intent.ACTION_BOOT_COMPLETED);
  intentFilter.addAction(DownloadManager.ACTION_DOWNLOAD_COMPLETE);
 

  registerReceiver(myReceiver, intentFilter);
  Log.d("My Tag","브로드캐스트리시버 등록됨");
 
 }
 @Override
 public void onResume(){
  super.onResume();
  IntentFilter intentFilter = new IntentFilter(Intent.ACTION_BOOT_COMPLETED);
  intentFilter.addAction(DownloadManager.ACTION_DOWNLOAD_COMPLETE);
  registerReceiver(myReceiver, intentFilter);
 }
 
}

어디가 문제인지 전혀 감을 못잡겠습니다...

인터넷을 검색해서 자료를 응용해서 짜봤는데...

어디가 잘못된건지 힌트라도 알려주시면 안되겠습니까?

익명사용자 님이 2014년 4월 14일 질문
DownloadManager.ACTION_DOWNLOAD_COMPLETE 상수에 정의한 값이 "android.intent.action.DOWNLOAD_COMPLETE"와 똑같은지 확인해 보세요
매니페스트에 정의한 android.intent.action.DOWNLOAD_COMPLETE 이 문제인건가요??
그건 아닙니다~
ACTION_BOOT_COMPLETED은 들어오는데
DOWNLOAD_COMPLETE는 안들어온다고 하셔서요
상수에 정의한 값과 매니페스트에 있는 값이 토시 하나라도 틀리면 들어오지 않아서 말씀 드려봤습니다.
sendBroadcast()할 때도 상수를 쓰고 그러면 보통은 들어옵니다만...ㅠ

그리고 제가 알기로 매니페이스에 등록한 리시버는 따로 registerReceiver를 하지 않아도 작동하는 것으로 압니다
manifest.xml
 <uses-permission android:name="android.permission.ACCESS_ALL_DOWNLOADS" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.RECEVIE_BOOT_COMPLETE" />

<receiver android:name=".Down_Receiver" >
            <intent-filter>
                <action android:name="android.intent.action.DOWNLOAD_COMPLETE" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </receiver>

Down_Receiver.java
public class Down_Receiver extends BroadcastReceiver {

    static final String DOWNLOAD_ACTION = "android.intent.action.DOWNLOAD_COMPLETE";
   
    @Override
    public void onReceive(Context context, Intent intent){
        Log.d("hi", "리시버 작동 : [" + intent.getAction() + "]");
       
        if(intent.getAction().equals(DOWNLOAD_ACTION))
        {
            Log.d("hi", "다운로드 완료 이벤트 캐치");
        }
    }
}

새롭게 해보았는데.... 웹에서 다운로드를 받으면
리시브 하지 못할까요;;;?
아예 로그도 나오지를 못하네요

2개의 답변

+1 추천
브로드캐스트를 하나 만드세요.

거기에는 public static final String으로 된 상수가 있을겁니다. 액션을 정의한 상수죠

ACTION_MY = "br.action.my";라고 하겠습니다.

매니페스트에 receiver를 등록합니다.

인텐트 필터에 액션을 설정해주어야 하겠죠

<action android:name="br.action.my" /> <!-- 보시면 상수로 정해준 값과 동일합니다. -->

이제 다운로드를 받습니다.

다운로드가 끝나는 시점에 Intent를 만들고 방송해봅시다.

Intent intent = new Intent(MyBroadcastReceiver.ACTION_MY);

sendBroadcast(intent);

sendBroadcast()가 호출되는 순간 MyBroadcastReceiver의 onReceive()가 호출될겁니다.
Lifeclue (7,930 포인트) 님이 2014년 4월 15일 답변
부팅시 자동실행은 BOOT_COMPLETE로 쉽게 되는데
"다운로드 끝나는 시점에 Intent를 만들고 방송해봅시다."라는
말씀은 메인 클래스에 다운로드 끝나는 시점을 코딩해야된다는 소리인가요?
ex) 다운로드 매니저 API를 선언해서 STATE 값을 이용해서 끝나는시점을 찾고 SUCCESS 값이면 Intent를 만들어 sendBroadcast()로 호출해서 onReceive()를 호출해야 된다는 건가요..;;
헐... 정말 죄송합니다. 제가 DownloadManager가 있는걸 몰랐네요;
위 코드는 모두 정상입니다. 잘 짜셨고요.

제가 테스트 한 코드입니다.
매니페스트:

        <receiver
            android:name="com.example.androidtest.MyBroadcastReceiver">
            <intent-filter>
                <action android:name="android.intent.action.DOWNLOAD_COMPLETE" />
            </intent-filter>
        </receiver>

브로드캐스트리시버:

    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(DownloadManager.ACTION_DOWNLOAD_COMPLETE)) {
            Log.d("Lifeclue", "Completed");
        }
    }

액티비티:

        DownloadManager downloadManager = (DownloadManager)getSystemService(Context.DOWNLOAD_SERVICE);
        DownloadManager.Request request = new DownloadManager.Request(Uri.parse("http://linkoriental.dothome.co.kr/images/large_img.jpg"));
        request.setTitle("다운로드 예제");
        request.setDescription("항목 설명");
        request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "");
        Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).mkdirs();
        downloadManager.enqueue(request);

현재는 로그가 잘 찍힙니다.

퍼미션입니다.

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

혼란드려 정말 죄송합니다 ㅠ
DownloadManager.Request request = new DownloadManager.Request(Uri.parse("http://linkoriental.dothome.co.kr/images/large_img.jpg"));
이 구문이 한정된거 아닌가요??
제가 짜볼려는건... 웹에서 돌아다니다가 첨부파일 다운로드 할수 있는 곳에 다운로드를 하여 다운로드 완료된거 감지를 해볼려고하는데
인터넷에 많이 찾아보앗지만...
예제문항들이 주소값을 입력해서 다운받는 형식이라서...
특히나 코딩한 앱을 실행상태에서 버튼을 눌러서 하는형식들이라...
제가 해볼려는 방법은 잘 없더라구요 ㅠ
대체적으로 http://androidhuman.com/431 "커니의 안드로이드 이야기" 예제 소스가 많더라구요..
혹시 작성할실때
브로드캐스트 클래스 따로 생성하셔서 하신건가요 ?
아니면 메인 클래스 내에 브로드캐스트를 선언하신건가요 ?
아 저는 클래스를 만들어서 했습니다.
그러니까 (WebView가 아닌)브라우저에서 다운로드를 하고 완료시점을 알고 싶으신건가요?
음.. 이건 받을 수 있는건지 모르겠습니다. ㅠ
네 맞습니다. 제가 지금 해보고싶은게
브라우저에서 어느 게시판에 첨부된 .apk 파일을 다운받을시
(안드로이드는 다운로드매니저를 통해서 다운을 하더라구요)
파일 다운로드 완료시점을 감지를 짜볼려고하는데...
그러한 예제들은 없어서...  이리저리 자료도 찾아보고 이클립스를 붙잡고있네요 ㅠ
http://www.mirwing.com/2012/02/android-download-manager.html
http://dalpaeng2.blogspot.kr/2013/11/downloadmanager_2078.html
http://vbflash.net/72
http://neoroid.tistory.com/entry/android-DownloadManager%EC%97%90-%EB%82%9A%EC%9D%B4%EB%8B%A4

이렇게 4개의 사이트 내용을 보니.. 될꺼같기도 하고 안될꺼같기도하고
긴가민가하네요..;;
아직 안드로이드 공부 한지 얼마 안되서
감도 못잡겠네요 ㅠ
이리저리 찾아봐도 FileObserver를 사용하라는 말만 있네요ㅠ
http://stackoverflow.com/questions/17310823/android-how-to-receive-the-intent-when-download-a-file-completely-by-browser
0 추천
제 생각으로는 android.permission.RECEVIE_BOOT_COMPLETE 으로는 자신이 다운로드 요청한 것이 완료된 것만 알 수 있을 것 같습니다. 구글이 제정신이라면 다른 앱이 통보를 받을 수 있게 했을 것 같지는 않아요.
익명사용자 님이 2014년 4월 16일 답변
...