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

서비스에서 브로드캐스트리시버가 작동을 안합니다....도와주세요..

0 추천
public class CService extends Service {

    BroadcastReceiver CReceiver = null;
    Bitmap bm;
    View view;
    @Override
    public void onCreate(){
        super.onCreate();

        Intent intent = new Intent(this, MainActivity.class);
        PendingIntent pIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
        Notification noti = new NotificationCompat.Builder(this)
                .setContentTitle("Capture & Crop")
                .setContentText("Running Cature & Crop Service")
                        //.setSmallIcon(R.drawable.ic_luncher)    //나중에 아이콘추가용
                .setContentIntent(pIntent)
                .build();

        startForeground(6974, noti);


    }
   
    private void screenshot(Bitmap bm){

        try {
            File path = new File("/sdcard/CropCature");
            if (!path.isDirectory()) {
                path.mkdir();
            }

            String temp = "/sdcard/CropCapture";
            temp = temp + System.currentTimeMillis();
            temp = temp + ".jpg";

            FileOutputStream out = new FileOutputStream(temp);
            bm.compress(Bitmap.CompressFormat.JPEG, 100, out);//확장자,퀄리티
            Toast.makeText(this,"스크린샷"+temp+"이 저장되었습니다.",Toast.LENGTH_SHORT).show();
            sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageState())));
        }catch (FileNotFoundException e){
            Log.d("FileNotFoundException:",e.getMessage());
        }
    }
    @Override
    public int onStartCommand(Intent intent,int flags, int startId) {
        super.onStartCommand(intent, flags, startId);
        Toast.makeText(this,"서비스실행.",Toast.LENGTH_SHORT).show();

        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("android.intent.extra.KEY_EVENT");
        intentFilter.addAction("android.intent.action.MEDIA_BUTTON");

        CReceiver = new BroadcastReceiver()
        {
            @Override
            public void onReceive(Context context, Intent intent){
                
                Toast.makeText(getBaseContext(), "리시버작동", Toast.LENGTH_SHORT).show();

                KeyEvent event = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
                if (event == null) {
                    return;
                }
                int action = event.getAction();

                if (action == KeyEvent.ACTION_DOWN) {
                    try{
                        View v1 = view.getRootView();
                        v1.setDrawingCacheEnabled(true);
                        bm = v1.getDrawingCache();
                        screenshot(bm);
                    }catch (Exception e){
                        e.printStackTrace();
                    }
                } else if(action == KeyEvent.KEYCODE_VOLUME_DOWN)
                {
                    try{
                        View v1 = view.getRootView();
                        v1.setDrawingCacheEnabled(true);
                        bm = v1.getDrawingCache();
                        screenshot(bm);
                    }catch (Exception e){
                        e.printStackTrace();
                    }
                }
            }
        };
        registerReceiver(CReceiver, intentFilter);

        return  START_STICKY;
    }
    @Override
    public void onDestroy(){
        unregisterReceiver(CReceiver);

        super.onDestroy();
    }

    @Override
    public IBinder onBind(Intent arg0){
        return null;
    }
}

초보입니다... 서비스는 잘 작동합니다. 근데 무슨이유에선지 리시버가 아예작동을 안해서 무반응입니다.(저기 토스트를 넣어봤는데도 아무반응도 안납니다..)도와주세요

익명사용자 님이 2015년 5월 13일 질문

2개의 답변

+1 추천
intent filter에 Intent.ACTION_MEDIA_MOUNTED를 넣어야하고, key_event는 넘겨받은 intent에서 get 할 때 사용하는 key가 돼야 합니다.
쎄미 (162,410 포인트) 님이 2015년 5월 14일 답변
0 추천
브로드캐스트 리시버 등록 시 해당 인텐트 필터에 ACTION_MEDIA_MOUNTED 액션 추가하셨나요?
작전동 (5,890 포인트) 님이 2015년 5월 14일 답변
감사합니다.근데
ACTION_MEDIA_MOUNTED는 보내기만하는거고 받을려고하는건 EXTRA_KEY_EVENT인데 따로 등록해야 리시버가 작동하나요??
지금 다시해보고 로그캣보니까 리시버해제에서 리시버를 찾을수없다고 오류가 나던데.. 등록하는거에서 오류인거같은데..조금만더 설명해주실수있나요?
제가 질문을 잘못 이해했네요. 보니 서비스 내에서 볼륨 업, 다운 이벤트를 받고싶은가본데..
아래 참고 바랍니다.
http://stackoverflow.com/questions/19345705/key-listener-in-service
아니면 인텐트필터 액션을 "android.intent.action.MEDIA_BUTTON" 로 바꿔보세요. 안해본거라 잘 모르겠네요.
...