【问题标题】:recording audio in android app by holding a button on it通过按住一个按钮在Android应用程序中录制音频
【发布时间】:2017-12-06 18:39:24
【问题描述】:

目的-我实际上是在制作门铃类型的应用程序,在点击按钮时,应用程序响起(播放小音频)并按住它时应用程序会记录音频,直到用户按住它。 我的目标 - 当用户按住按钮时开始录制并在用户释放按钮时停止。

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;}
    });
}

}

问题 - 触摸记录按钮时应用程序崩溃

如果你知道更好的方法,请告诉。

【问题讨论】:

    标签: android button onlongclicklistener


    【解决方案1】:

    您应该使用 OnTouchListener 事件并在 ACTION_DOWN 时开始录制并在 ACTION_UP 时停止。

    请检查这个 How to use View.OnTouchListener instead of onClick

    【讨论】:

    • 用 ontouchlistener 编辑了代码,还是不行
    【解决方案2】:

    而不是OnClick,您应该使用OnTouch Listener 事件并在ACTION_DOWN 上开始录制并在ACTION_UP 上停止,添加permissions 以及音频录制。!

     <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 ");
    
        }
    

    【讨论】:

    • on点击响铃按钮? ,戒指工作正常。为麦克风和写入存储添加了权限
    • 不,不是,我尝试从 android 开发者网站上的示例中复制媒体记录器代码中的权限部分
    • 显示警告 - customview 按钮具有 OnseLlistenerOn 但它不会覆盖 performClick
    • 粘贴你的代码!
    • 转到应用程序管理器并在应用程序信息中尝试检查这些权限,然后运行应用程序。!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-04
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多