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

Fragment 안에 기능이 작동을 할려면 어떻게 해야 하나요?

0 추천

안녕하세요.. 3일동안 고민하고 고칠려해도 답이 안나와 질문드립니다 ㅠㅡㅠ

제 구조도는 아래와 같습니다. 메인에서 Fragment1 을 선택하면 녹음기가 있고 그 녹음기를 실행하는 과정입니다.

구조도 메인 -> Fr -> 녹음

혹시나 해서 녹음기능만 따로 체크는 해봤는데 정상 작동확인했습니다.

중간에 Fragment가 끼면서 호출이 안되는듯 합니다..

아래 코드를 확인해주시고 조금이라도 고민 부탁드리겠습니다 ㅠㅡㅠ!!

MainActivity.JAVA

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        LinearLayout button1 = (LinearLayout) findViewById(R.id.button1);

        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {getFragmentManager().beginTransaction().replace(R.id.main_frame,new Fragment1()).commit();} });
            } }); }}

Fragment1.JAVA

public class Fragment1 extends Fragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_fragment1,container,false);
}
    public static class Fragment1_Recorder extends AppCompatActivity {
        private final int mBufferSize = 1024;
        private final int mBytesPerElement = 2;
        private final int[] mSampleRates = new int[] {44100, 22050, 11025, 8000};
        private final short[] mAudioFormats = new short[] {AudioFormat.ENCODING_PCM_16BIT, AudioFormat.ENCODING_PCM_8BIT};
        private final short[] mChannelConfigs = new short[] {AudioFormat.CHANNEL_IN_STEREO, AudioFormat.CHANNEL_IN_MONO};
        private int mSampleRate;
        private short mAudioFormat;
        private short mChannelConfig;
        private AudioRecord mRecorder = null;
        private Thread mRecordingThread = null;
        private Button mRecordBtn, mPlayBtn;
        private boolean mIsRecording = false;
        private String mPath = "";

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.fragment_fragment1);
            mRecordBtn = (Button)findViewById(R.id.start);
            mPlayBtn = (Button)findViewById(R.id.play);
            mRecordBtn.setOnClickListener(btnClick);
            mPlayBtn.setOnClickListener(btnClick);
        }
        private void startRecording() {
            mRecorder = findAudioRecord();
            mRecorder.startRecording();
            mIsRecording = true;
            mRecordingThread = new Thread(new Runnable() {

                @Override
                public void run() {
                    writeAudioDataToFile();
                }
            }, "AudioRecorder Thread");
            mRecordingThread.start();
        }
        private AudioRecord findAudioRecord() {
            for (int rate : mSampleRates) {
                for (short format : mAudioFormats) {
                    for (short channel : mChannelConfigs) {
                        try {
                            int bufferSize = AudioRecord.getMinBufferSize(rate, channel, format);
                            if (bufferSize != AudioRecord.ERROR_BAD_VALUE) {
                                mSampleRate = rate;
                                mAudioFormat = format;
                                mChannelConfig = channel;
                                AudioRecord recorder = new AudioRecord(MediaRecorder.AudioSource.DEFAULT, mSampleRate, mChannelConfig, mAudioFormat, bufferSize);
                                if (recorder.getState() == AudioRecord.STATE_INITIALIZED) {

                                }}} catch (Exception e) {
                            e.printStackTrace();
                        }}}}
            return null;
        }
        private void writeAudioDataToFile() {
            String sd = Environment.getExternalStorageDirectory().getAbsolutePath();
            mPath = sd + "/record_audiorecord.pcm";
            short sData[] = new short[mBufferSize];
            FileOutputStream fos = null;
            try {
                fos = new FileOutputStream(mPath);
                while (mIsRecording) {
                    mRecorder.read(sData, 0, mBufferSize);
                    byte bData[] = short2byte(sData);
                    fos.write(bData, 0, mBufferSize * mBytesPerElement);
                }
                fos.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        private byte[] short2byte(short[] sData) {
            int shortArrsize = sData.length;
            byte[] bytes = new byte[shortArrsize * 2];
            for (int i = 0; i < shortArrsize; i++) {
                bytes[i * 2] = (byte) (sData[i] & 0x00FF);
                bytes[(i * 2) + 1] = (byte) (sData[i] >> 8);
                sData[i] = 0;
            }
            return bytes;}
        private void stopRecording() {
            if (mRecorder != null) {
                mIsRecording = false;
                mRecorder.stop();
                mRecorder.release();
                mRecorder = null;
                mRecordingThread = null;
            }}
        private void playWaveFile() {
            int minBufferSize = AudioTrack.getMinBufferSize(mSampleRate, mChannelConfig, mAudioFormat);
            AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL, mSampleRate, mChannelConfig, mAudioFormat, minBufferSize, AudioTrack.MODE_STREAM);
            int count = 0;
            byte[] data = new byte[mBufferSize];
            try {
                FileInputStream fis = new FileInputStream(mPath);
                DataInputStream dis = new DataInputStream(fis);
                audioTrack.play();
               while ((count = dis.read(data, 0, mBufferSize)) > -1) {
                    audioTrack.write(data, 0, count);
                }
                audioTrack.stop();
                audioTrack.release();
                dis.close();
                fis.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();}}
        private View.OnClickListener btnClick = new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                switch (v.getId()) {
                    case R.id.start:
                        if (mIsRecording == false) {
                            startRecording();
                            mIsRecording = true;
                            mRecordBtn.setText("Stop Recording");
                        } else {
                            stopRecording();
                            mIsRecording = false;
                            mRecordBtn.setText("Start Recording");
                        }
                        break;
                    case R.id.play:
                        if (mPath.length() == 0 || mIsRecording) {
                            Toast.makeText(Fragment1_Recorder.this, "Please record, first.", Toast.LENGTH_SHORT).show();
                            return; }
                        playWaveFile();
                        break;}} };
        @Override
        public boolean onKeyDown(int keyCode, KeyEvent event) {
            if (keyCode == KeyEvent.KEYCODE_BACK) {
                finish(); }
            return super.onKeyDown(keyCode, event); }}}
안드초보입니다l (140 포인트) 님이 2018년 11월 4일 질문

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...