0

Purpose- I'm actually making doorbell kind of app, where on tapping a button ,app rings(plays a small audio) & on holding it app records audio till user holds it. my objective- start recording when user holds button & stops when user releases button.

public class MainActivity extends AppCompatActivity {
private static final String LOG_TAG = "AudioRecordTest";
private Button ring,record;
private String outputfile = null;
private MediaRecorder rec = null;
private static final int REQUEST_RECORD_AUDIO_PERMISSION = 200;
// Requesting permission to RECORD_AUDIO
private boolean permissionToRecordAccepted = false;
private String [] permissions = {Manifest.permission.RECORD_AUDIO};

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    switch (requestCode){
        case REQUEST_RECORD_AUDIO_PERMISSION:
            permissionToRecordAccepted  = grantResults[0] == PackageManager.PERMISSION_GRANTED;
            break;
    }
    if (!permissionToRecordAccepted ) finish();

}




private void startrec()
{
    Log.e(LOG_TAG, "startRecording:Calling ");
    rec = new MediaRecorder();
    rec.setAudioSource(MediaRecorder.AudioSource.MIC);
    rec.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB);
    rec.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB);
    outputfile = Environment.getExternalStorageDirectory().getAbsolutePath() + "/rec.amr";
    rec.setOutputFile(outputfile);
    try {
        rec.prepare();
        rec.start();
    } catch (IOException ioe2) {
    }
    Toast.makeText(MainActivity.this, "RECORDING STARTED", Toast.LENGTH_SHORT).show();

}
private void stoprec(){
    rec.stop();rec.release();
    Toast.makeText(MainActivity.this, "RECORDING STOPPED", Toast.LENGTH_SHORT).show();
    Log.e(LOG_TAG, "stopRecording:Calling ");
}


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ring = findViewById(R.id.ringbutton);
    record =findViewById(R.id.recordbutton);

    ring.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v1) {
            try {
                Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
                Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), notification);
                r.play();
            } catch (IllegalStateException ise) {}
        }
    });

    record.setOnTouchListener(new View.OnTouchListener(){
        @Override
        public boolean onTouch(View v2, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_DOWN) startrec();
         else if (event.getAction() == MotionEvent.ACTION_UP) stoprec();
            return true;}
    });
}

}

Problem- app crashes on touching record button

if u know a better way to do this pls tell.

2 Answers2

0

You should use OnTouchListener event and start recording on ACTION_DOWN and stop on ACTION_UP.

Please check this How to use View.OnTouchListener instead of onClick

0

Instead of OnClick You should use OnTouch Listener event and start recording on ACTION_DOWN and stop on ACTION_UP do add permissions as well for audio recording.!

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

    private MediaRecorder mRecorder = null;     

    private String mFileName = null;



      mRecordButton.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View view, MotionEvent motionEvent) {

                    //if Button is Pressed.! or user Id Holding Button
                    if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
                        startRecording();

                        Toast.makeText(context, "Hold To Record.!", Toast.LENGTH_SHORT).show();

                    } else if (motionEvent.getAction() == MotionEvent.ACTION_UP) {

                        //Do Nothing
                        stopRecording();

                        Toast.makeText(context, "Recorded.!", Toast.LENGTH_SHORT).show();
                    }


                    return false;
                }
            });


    private void startRecording() {

        mRecorder = new MediaRecorder();
        mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        mRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
        // Record to the external cache directory for visibility
        mFileName = Environment.getExternalStorageDirectory().getAbsolutePath();

        //getExternalCacheDir().getAbsolutePath();

        String id = new String(UUID.randomUUID().toString());

        mFileName += "/recordedAudio/" + id + ".mp3";
        mRecorder.setOutputFile(mFileName);
        mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

        try {
            mRecorder.prepare();
        } catch (IOException e) {
            Log.e(LOG_TAG, "prepare() failed");
        }

        mRecorder.start();

        Log.e(LOG_TAG, "Recording:Calling ");

    }

    private void stopRecording() {
        mRecorder.stop();
        mRecorder.release();
        mRecorder = null;

        Log.e(LOG_TAG, "stopRecording:Calling ");

    }
Atif AbbAsi
  • 5,633
  • 7
  • 26
  • 47
  • onClick on ring button? ,ring is working fine . Permissions are added for mic & writing storage –  Dec 07 '17 at 16:30
  • nah , it isn't , I tried copying the permission section from media recorder code from example on android developer site –  Dec 08 '17 at 06:05
  • a warning is shown- customview button has OnseLlistenerOn but it does not override performClick –  Dec 08 '17 at 06:38
  • Paste Your Code.! – Atif AbbAsi Dec 08 '17 at 06:43
  • Go to Application Manager and in Application information try to check those permissions and then run app.! – Atif AbbAsi Dec 08 '17 at 06:47
  • I did that , & notice something weird, when permission for storage is dislabled, app display "Recording started" but when it's denied it just ends on touching record button –  Dec 08 '17 at 08:44
  • code is same as above , android manifest code https://pastebin.com/2hVxaX86 & layout code https://pastebin.com/EPft2WYU –  Dec 08 '17 at 17:12