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

흔들면 SoundPool 재생 오류가 뜨네요 ㅠㅠ

–1 추천
package com.example.friedegg.myapplication;

import android.app.Activity;
import android.app.IntentService;
import android.content.Intent;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.media.AudioManager;
import android.media.SoundPool;
import android.os.Bundle;
import android.os.Handler;
import android.os.SystemClock;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity implements SensorEventListener{
    private static SoundPool soundPool;
    private static int sound;

    private long lastTime;
    private float speed;
    private float lastX;
    private float lastY;
    private float lastZ;
    private float x, y, z;

    private static final int SHAKE_THRESHOLD = 800;
    private static final int DATA_X = SensorManager.DATA_X;
    private static final int DATA_Y = SensorManager.DATA_Y;
    private static final int DATA_Z = SensorManager.DATA_Z;

    private SensorManager sensorManager;
    private Sensor accelerormeterSensor;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
        accelerormeterSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);


    }

    @Override
    public void onStart() {
        super.onStart();
        if (accelerormeterSensor != null)
            sensorManager.registerListener(this, accelerormeterSensor,
                    SensorManager.SENSOR_DELAY_GAME);
    }

    @Override
    public void onStop() {
        super.onStop();
        if (sensorManager != null)
            sensorManager.unregisterListener(this);
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {

    }

    @Override
    public void onSensorChanged(SensorEvent event) {
        if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
            long currentTime = System.currentTimeMillis();
            long gabOfTime = (currentTime - lastTime);
            if (gabOfTime > 100) {
                lastTime = currentTime;
                x = event.values[SensorManager.DATA_X];
                y = event.values[SensorManager.DATA_Y];
                z = event.values[SensorManager.DATA_Z];

                speed = Math.abs(x + y + z - lastX - lastY - lastZ) / gabOfTime * 10000;

                if (speed > SHAKE_THRESHOLD) {
                    soundPool = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);
                    sound = soundPool.load(this,R.raw.doo,1);
                    soundPool.play(sound,1,1,0,0,1);

                    Toast.makeText(this,"흔들기",Toast.LENGTH_SHORT).show();
                }

                lastX = event.values[DATA_X];
                lastY = event.values[DATA_Y];
                lastZ = event.values[DATA_Z];
            }

        }

    }

}
 
뭘 빼먹은게 있을까요? 로그에서는 
 
04-03 21:04:14.388 20771-20771/com.example.friedegg.myapplication V/SoundPool: load: fd=83, offset=225480, length=20644, priority=1
04-03 21:04:14.388 20771-20771/com.example.friedegg.myapplication V/SoundPool: create sampleID=24, fd=86, offset=20644, length=225480
04-03 21:04:14.388 20771-20771/com.example.friedegg.myapplication V/SoundPool: doLoad: loading sample sampleID=24
04-03 21:04:14.388 20771-20796/com.example.friedegg.myapplication V/SoundPoolThread: Got message m=2, mData=24
04-03 21:04:14.388 20771-20796/com.example.friedegg.myapplication V/SoundPool: Start decode
04-03 21:04:14.388 20771-20796/com.example.friedegg.myapplication V/MediaPlayer[Native]: decode(86, 225480, 20644)
04-03 21:04:14.398 20771-20771/com.example.friedegg.myapplication V/SoundPool: play sampleID=24, leftVolume=1.000000, rightVolume=1.000000, priority=0, loop=0, rate=1.000000
04-03 21:04:14.398 20771-20771/com.example.friedegg.myapplication W/SoundPool:   sample 24 not READY
04-03 21:04:14.498 20771-20796/com.example.friedegg.myapplication V/SoundPool: close(86)
04-03 21:04:14.498 20771-20796/com.example.friedegg.myapplication V/SoundPool: pointer = 0x7b41f000, size = 138240, sampleRate = 44100, numChannels = 2
04-03 21:04:15.138 20771-20771/com.example.friedegg.myapplication I/SensorManager: removeAllSensors() [Sensor: LGE Accelerometer Sensor] bycom.example.friedegg.myapplication.MainActivity.onStop():58
04-03 21:04:15.428 20771-20771/com.example.friedegg.myapplication E/ViewRootImpl: mIsPenSupport: :false
 
 
이렇게 뜹니다 ㅠㅅㅠ 뭘 빼먹은게 있을까요 음악 파일도 20kb인데 혹시 용량때문인가유..
익명사용자 님이 2017년 4월 3일 질문
코드를 http://www.masterqna.com/android/1 로 올린 거 맞나요?

2개의 답변

0 추천
로그라도 제대로 올려주시던가 중요한 부분은 다짤리게 올리고 날짜랑 시간 패키지명만 올려주면 어떻게 알아요 내용은 다빼고 날짜 만 보여주고 이런 문제가 있는데 어떻게 해야하죠 이러면 누가 알아요
익명사용자 님이 2017년 4월 4일 답변
스크롤바가 안 나와서 그러는 것 같아요. 어떤 분들 보면 저렇게 나오던데, 뭘로 올려서 그런지 모르겠네요.
0 추천
onSensorChanged 에서 SoundPool을 매번 new 하던데, 생성하다보면  OOM 나올 듯 한데요..

load까진 onCreate 같은데서 하시는것이 좋을 듯 하며,

흔드는 이벤트가 엄청 들어올 수 있으니 onSensorChanged 에서는 핸들러 sendMessageDelayed 같은 것으로 ,  

이벤트만 핸들러로 넘기고 핸들러에서 play 하게 변경 해 보시는게 좋을 듯 합니다.

 

또한 화면 회전을 막아 두신 건지 확인 해 보세요. 회전이 되면 매번 onCreate, onsStart, onStop가 불려 꼬일 수 있을 듯 합니다.
익명사용자 님이 2017년 4월 4일 답변
2017년 4월 4일 수정
...