Android录音实现的代码中,setAudioSource()方法出错,程序停止 4C

参照网上这个代码,
代码完全一样,但是
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);

这行代码出错,权限也加了,然而点击录音之后程序停止
04-06 00:00:37.907 2297-2297/com.gabos.tsounds E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.gabos.tsounds, PID: 2297
java.lang.RuntimeException: setAudioSource failed.
at android.media.MediaRecorder.setAudioSource(Native Method)
at com.gabos.tsounds.RecordActivity$startRecordListener.onClick(RecordActivity.java:69)
at android.view.View.performClick(View.java:5609)
at android.view.View$PerformClick.run(View.java:22259)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
图片说明

1个回答

你是不是在6.0的手机上测试的?如果是的话,猜测是权限没有动态申请。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
android 录音功能报错

* 做安卓的录音功能代码如下: mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT); mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); File audioFile = null; try { audioFile = File.createTempFile("record_369" , ".amr"); } catch (IOException e) { e.printStackTrace(); } mediaRecorder.setOutputFile(audioFile.getAbsolutePath()); try { mediaRecorder.prepare(); } catch (IOException e) { e.printStackTrace(); } mediaRecorder.start(); 一直会报 java.lang.RuntimeException: setAudioSource failed. 异常 而且添加了权限 <uses-permission android:name="android.permission.RECORD_AUDIO"/> 请问这是怎么回事啊?

Android项目一点录音按钮就停止运行

package com.example.task314; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import android.media.MediaRecorder; import android.os.Bundle; import android.os.Environment; import android.os.SystemClock; import android.app.Activity; import android.view.Menu; import android.view.View; import android.view.Window; import android.widget.Button; import android.widget.Chronometer; import android.widget.Toast; /** * 在Android上编写一个程序,能够启动本机的录音功能、拍照功能、摄像功能。不考虑权限问题 * @author Administrator * */ public class Sound extends Activity { private Button bt1 = null; private Button bt2 = null; private Chronometer ch1 =null; private MediaRecorder mr = null; private String PATH = Environment.getExternalStorageDirectory().getAbsolutePath()+"/media"; private int i=0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_sound); bt1 = (Button)this.findViewById(R.id.button1); bt2 = (Button)this.findViewById(R.id.button2); ch1 = (Chronometer)findViewById(R.id.chronometer1); //创建一个临时的音频输出文件 // audioFile = File.createTempFile("record_", ".amr"); //第4步:指定音频输出文件 // mediaRecorder.setOutputFile(audioFile.getAbsolutePath()); File file = new File(PATH); if (!file.exists()) { //按照指定的路径创建文件夹 file.mkdirs(); } bt1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub mr = new MediaRecorder(); // 第1步:设置音频来源(MIC表示麦克风) mr.setAudioSource(MediaRecorder.AudioSource.MIC); //第2步:设置音频输出格式(默认的输出格式) mr.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT); //第3步:设置音频编码方式(默认的编码方式) mr.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); SimpleDateFormat sDateFormat = new SimpleDateFormat("yyyyMMdd_hhmmss"); String date = sDateFormat.format(new java.util.Date()); System.out.println("time---"+date); String mFileName = PATH + "/"+date+".amr"; mr.setOutputFile(mFileName); // System.out.println(""+audioFile.getAbsolutePath().toString()); //第5步:调用prepare方法 try { mr.prepare(); } catch (IllegalStateException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } //第6步:调用start方法开始录音 mr.start(); //启动计时器 // ch1.setBase(SystemClock.elapsedRealtime()); ch1.start(); Toast.makeText(getApplicationContext(), "开启", 0).show(); bt1.setEnabled(false); } }); bt2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub //第7步:停止录音 if(mr != null ) { mr.stop(); ch1.stop(); ch1.setBase(SystemClock.elapsedRealtime()); Toast.makeText(getApplicationContext(), "关闭", 0).show(); bt1.setEnabled(true); } } }); } }

安卓的录音程序,运行时闪退求解

按照教程写了个安卓的录音程序,在点击结束录音时闪退,求大神帮看看代码,感谢 闪退时报错日志 04-08 19:47:29.702: D/ViewRootImpl(11731): ViewPostImeInputStage processPointer 0 04-08 19:47:29.802: D/ViewRootImpl(11731): ViewPostImeInputStage processPointer 1 04-08 19:47:29.802: E/MediaRecorder(11731): stop called in an invalid state: 4 04-08 19:47:29.802: D/AndroidRuntime(11731): Shutting down VM 04-08 19:47:29.802: E/AndroidRuntime(11731): FATAL EXCEPTION: main 04-08 19:47:29.802: E/AndroidRuntime(11731): Process: com.example.recorder, PID: 11731 04-08 19:47:29.802: E/AndroidRuntime(11731): java.lang.IllegalStateException 04-08 19:47:29.802: E/AndroidRuntime(11731): at android.media.MediaRecorder._stop(Native Method) 04-08 19:47:29.802: E/AndroidRuntime(11731): at android.media.MediaRecorder.stop(MediaRecorder.java:976) 04-08 19:47:29.802: E/AndroidRuntime(11731): at com.example.recorder.MainActivity.stop(MainActivity.java:102) 04-08 19:47:29.802: E/AndroidRuntime(11731): at com.example.recorder.MainActivity$2.onClick(MainActivity.java:61) 04-08 19:47:29.802: E/AndroidRuntime(11731): at android.view.View.performClick(View.java:5698) 04-08 19:47:29.802: E/AndroidRuntime(11731): at android.widget.TextView.performClick(TextView.java:10896) 04-08 19:47:29.802: E/AndroidRuntime(11731): at android.view.View$PerformClick.run(View.java:22565) 04-08 19:47:29.802: E/AndroidRuntime(11731): at android.os.Handler.handleCallback(Handler.java:739) 04-08 19:47:29.802: E/AndroidRuntime(11731): at android.os.Handler.dispatchMessage(Handler.java:95) 04-08 19:47:29.802: E/AndroidRuntime(11731): at android.os.Looper.loop(Looper.java:148) 04-08 19:47:29.802: E/AndroidRuntime(11731): at android.app.ActivityThread.main(ActivityThread.java:7224) 04-08 19:47:29.802: E/AndroidRuntime(11731): at java.lang.reflect.Method.invoke(Native Method) 04-08 19:47:29.802: E/AndroidRuntime(11731): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 04-08 19:47:29.802: E/AndroidRuntime(11731): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 04-08 19:47:32.042: I/Process(11731): Sending signal. PID: 11731 SIG: 9 DEBUG 线程 [main](已暂挂(异常 IllegalStateException)) MediaRecorder._stop() 行: 不可用 [本机方法] MediaRecorder.stop() 行: 976 MainActivity.stop() 行: 102 MainActivity$2.onClick(View) 行: 61 Button(View).performClick() 行: 5698 Button(TextView).performClick() 行: 10896 View$PerformClick.run() 行: 22565 Handler.handleCallback(Message) 行: 739 ViewRootImpl$ViewRootHandler(Handler).dispatchMessage(Message) 行: 95 Looper.loop() 行: 148 ActivityThread.main(String[]) 行: 7224 Method.invoke(Object, Object...) 行: 不可用 [本机方法] ZygoteInit$MethodAndArgsCaller.run() 行: 1230 ZygoteInit.main(String[]) 行: 1120 主程序 package com.example.recorder; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import java.io.IOException; import android.media.MediaRecorder; import android.media.AudioFormat; import android.media.AudioRecord; import android.os.Bundle; import android.os.Environment; import android.app.Activity; import android.util.Log; import android.widget.Button; import java.io.BufferedOutputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStream; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; public class MainActivity extends Activity { MediaRecorder audioRecorder; Button START; Button END; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //creat START=(Button)findViewById(R.id.start); END=(Button)findViewById(R.id.end); START.setOnClickListener(new View.OnClickListener() { public void onClick(View arg0) { record(); } }); END.setOnClickListener(new View.OnClickListener() { public void onClick(View arg0) { stop(); } }); } public void record() { if(audioRecorder==null) { audioRecorder=new MediaRecorder(); } String path=Environment.getExternalStorageDirectory().getAbsolutePath()+"/test.mp4"; File file=new File(path); if(file.exists()) file.delete(); try { file.createNewFile(); audioRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); audioRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); audioRecorder.setAudioEncodingBitRate(MediaRecorder.AudioEncoder.AMR_NB); audioRecorder.setOutputFile(path); audioRecorder.prepare(); audioRecorder.start(); } catch(IOException e) { e.printStackTrace(); } catch (IllegalStateException e) { e.printStackTrace(); } START.setText("recording"); } public void stop() { if(audioRecorder!=null) { audioRecorder.stop(); audioRecorder.release(); audioRecorder=null; } START.setText("录音"); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } } MANIFEXT: <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.recorder" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="19" android:targetSdkVersion="19" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>

部分手机录音时setAudioSource为VOICE_CALL会报start failed

在华为P8和mate7等6.0的手机上 mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL); 录音来源设置为VOICE_CALL然后启动的时候会报start failed但是设置在MIC就没问题了,为啥有的手机不能通话录音,有什么解决办法吗

Android关于录制音频时mediaRecorder.setAudioSamplingRate()的大小

mediaRecorder = new MediaRecorder(); mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); mediaRecorder.setAudioChannels(1); //采样频率和bit频率有待提高(前提不会导致bug) mediaRecorder.setAudioSamplingRate(8000); mediaRecorder.setAudioEncodingBitRate(8000); 当我把setAudioSamplingRate(8000)的参数调到10000以上的时候,代码就崩溃了。 求大神解惑,谢谢

编写一个安卓入门小程序,程序闪退,求解

写一个安卓实现录音与播放功能的程序,但是apk运行时一按录音键就闪退,求大神帮忙看看代码,感谢 源文件: package com.example.recorder; import java.io.File; import java.io.IOException; import android.app.Activity; import android.media.MediaPlayer; import android.media.MediaRecorder; import android.os.Bundle; import android.os.Environment; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class MainActivity extends Activity { private static final String LOG_TAG = "AudioRecordTest"; // 语音文件保存路径 private String FileName = null; // 界面控件 private Button startRecord; private Button startPlay; private Button stopRecord; private Button stopPlay; // 语音操作对象 private MediaPlayer mPlayer = null; private MediaRecorder mRecorder = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //开始录音 startRecord = (Button) findViewById(R.id.startrecord); // 绑定监听器 startRecord.setOnClickListener(new startRecordListener()); // 结束录音 stopRecord = (Button) findViewById(R.id.stoprecord); stopRecord.setOnClickListener(new stopRecordListener()); // 开始播放 startPlay = (Button) findViewById(R.id.play); // 绑定监听器 startPlay.setOnClickListener(new startPlayListener()); // 结束播放 stopPlay = (Button) findViewById(R.id.stop); stopPlay.setOnClickListener(new stopPlayListener()); FileName = Environment.getExternalStorageDirectory().getAbsolutePath(); FileName = FileName + File.separator + "audiorecordtest.arm"; } // 开始录音 class startRecordListener implements OnClickListener { @Override public void onClick(View v) { // TODO Auto-generated method stub mRecorder = new MediaRecorder(); mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT); mRecorder.setOutputFile(FileName); mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); try { mRecorder.prepare(); } catch (IOException e) { Log.e(LOG_TAG, "prepare() failed"); } mRecorder.start(); } } // 停止录音 class stopRecordListener implements OnClickListener { @Override public void onClick(View v) { // TODO Auto-generated method stub mRecorder.stop(); mRecorder.release(); mRecorder = null; } } // 播放录音 class startPlayListener implements OnClickListener { @Override public void onClick(View v) { // TODO Auto-generated method stub mPlayer = new MediaPlayer(); try { mPlayer.setDataSource(FileName); mPlayer.prepare(); mPlayer.start(); } catch (IOException e) { Log.e(LOG_TAG, "播放失败"); } } } // 停止播放录音 class stopPlayListener implements OnClickListener { @Override public void onClick(View v) { // TODO Auto-generated method stub mPlayer.release(); mPlayer = null; } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } } R文件 /* AUTO-GENERATED FILE. DO NOT MODIFY. * * This class was automatically generated by the * aapt tool from the resource data it found. It * should not be modified by hand. */ package com.example.recorder; public final class R { public static final class attr { } public static final class dimen { /** Default screen margins, per the Android Design guidelines. Example customization of dimensions originally defined in res/values/dimens.xml (such as screen margins) for screens with more than 820dp of available width. This would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively). */ public static final int activity_horizontal_margin=0x7f040000; public static final int activity_vertical_margin=0x7f040001; } public static final class drawable { public static final int ic_launcher=0x7f020000; } public static final class id { public static final int action_settings=0x7f080005; public static final int play=0x7f080002; public static final int select=0x7f080004; public static final int startrecord=0x7f080000; public static final int stop=0x7f080003; public static final int stoprecord=0x7f080001; } public static final class layout { public static final int activity_main=0x7f030000; } public static final class menu { public static final int main=0x7f070000; } public static final class string { public static final int action_settings=0x7f050002; public static final int app_name=0x7f050000; public static final int hello_world=0x7f050001; } public static final class style { /** Base application theme, dependent on API level. This theme is replaced by AppBaseTheme from res/values-vXX/styles.xml on newer devices. Theme customizations available in newer API levels can go in res/values-vXX/styles.xml, while customizations related to backward-compatibility can go here. Base application theme for API 11+. This theme completely replaces AppBaseTheme from res/values/styles.xml on API 11+ devices. API 11 theme customizations can go here. Base application theme for API 14+. This theme completely replaces AppBaseTheme from BOTH res/values/styles.xml and res/values-v11/styles.xml on API 14+ devices. API 14 theme customizations can go here. */ public static final int AppBaseTheme=0x7f060000; /** Application theme. All customizations that are NOT specific to a particular API-level can go here. */ public static final int AppTheme=0x7f060001; } }

6410开发板上跑Android 2.1 ,录音出现问题,求大神指点

我在6410的开发板上运行 Android 2.1,写了个程序 ,想要进行录音。代码 如下: mediaRecorder = new MediaRecorder(); Toast.makeText(TelListenner.this,"new MedioRecorder()成功", Toast.LENGTH_SHORT).show(); //myRecAudioFile = File.createTempFile("!"+MainActivity.strAddress1+MainActivity.strDate1, ".amr", dir); myRecAudioFile=new File(dir,MainActivity.strAddress1+MainActivity.strDate1+"new.amr"); Toast.makeText(TelListenner.this,"createTempFile()成功", Toast.LENGTH_SHORT).show(); mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); Toast.makeText(TelListenner.this,"setAudioSource成功", Toast.LENGTH_SHORT).show(); mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); Toast.makeText(TelListenner.this,"setOutputFormat成功", Toast.LENGTH_SHORT).show(); mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); mediaRecorder.setOutputFile(myRecAudioFile.getAbsolutePath());//保存路径 Toast.makeText(TelListenner.this,"保存路径成功", Toast.LENGTH_SHORT).show(); mediaRecorder.prepare(); Toast.makeText(TelListenner.this,"prepare成功", Toast.LENGTH_SHORT).show(); mediaRecorder.start(); 写了许多Toast,到 Toast.makeText(TelListenner.this,"保存路径成功",Toast.LENGTH_SHORT).show(); 这一句还能弹出Toast,但是prepare()函数执行之后就不能弹出"prepare成功"的字样。 我查了一下prepare()函数的作用,是Prepares the recorder to begin capturing and encoding data。我怀疑是不是这个函数会调用底层硬件,而底层硬件可能有问题才导致的prepare()不运行?? 另外,虽然File.createTempFile()这个函数执行了,但是在目录下面找不到建立的文件。这是因为什么?理论上讲,createTempFile()只要执行,就已经建立文件才对,虽然字节可能会是0,但是没理由文件都不存在啊。。。 这个问题困扰我两天了,求大神指导,万分感激~

在android中同时调用多个麦克风报错:android.media.MediaRecorder.start(Native Method)

1.问题描述:<br>在android中同时调用多个麦克风报错: <br>报错位置mr2.strat():第二个麦克风启动操作时报错。<br> 报错内容:<br> **android.media.MediaRecorder.start(Native Method)**<br> 代码如下: ![图片说明](https://img-ask.csdn.net/upload/201905/15/1557913924_439814.png) <br> <br> <br> ![图片说明](https://img-ask.csdn.net/upload/201905/15/1557914045_94388.png) 录音权限和存储权限已授予。 <br> <br> ``` private void startRecord(){ if(mr == null){ File dir = new File(Environment.getExternalStorageDirectory(),"sounds"); if(!dir.exists()){ dir.mkdirs(); } String filename = string1.getText().toString(); SimpleDateFormat df = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss");//设置日期格式 File soundFile = new File(dir,filename+df.format(new Date())+"_MIC"+".amr"); File soundFile2 = new File(dir,filename+df.format(new Date())+"_VOICE_COMMUNICATION"+".amr"); if(!soundFile.exists()){ try { soundFile.createNewFile(); } catch (IOException e) { e.printStackTrace(); } } if(!soundFile2.exists()){ try { soundFile2.createNewFile(); } catch (IOException e) { e.printStackTrace(); } } mr = new MediaRecorder(); mr.setAudioSource(MediaRecorder.AudioSource.DEFAULT); mr.setOutputFormat(MediaRecorder.OutputFormat.AMR_WB); //设置输出格式 mr.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_WB); //设置编码格式 mr.setOutputFile(soundFile.getAbsolutePath()); mr2 = new MediaRecorder(); mr2.setAudioSource(MediaRecorder.AudioSource.VOICE_COMMUNICATION); //音频输入源 mr2.setOutputFormat(MediaRecorder.OutputFormat.AMR_WB); mr2.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_WB); mr2.setOutputFile(soundFile2.getAbsolutePath()); try { mr.prepare(); mr.start();// mr2.prepare(); mr2.start();//**在这个位置报错** } catch (IOException e) { e.printStackTrace(); } } } //停止录制,资源释放 private void stopRecord(){ if(mr != null){ mr.stop(); mr2.stop(); mr.release(); mr2.release(); mr = null; mr2 = null; } } ```

电话录音导出的文件为什么不能播放?

写了一个电话录音的程序,但是在向SD卡中刻录声音的时候,并不是期望的3gp格式,无法进行播放,不知道是什么原因? 代码如下 配置文件: <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="cn.xushuai.phonelistener" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="15" /> <application android:label="@string/app_name" android:icon="@drawable/ic_launcher" android:theme="@style/AppTheme"> <service android:name=".PhoneService"></service> <receiver android:name=".BootBroadcastReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"/> </intent-filter> </receiver> </application> <!-- 电话状态监听权限 --> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <!--向SD卡写入数据权限 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <!-- 在SD卡中创建与删除文件权限 --> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> <!-- 刻录权限 --> <uses-permission android:name="android.permission.RECORD_AUDIO"/> </manifest> 刻录的业务类: import java.io.File; import android.app.Service; import android.content.Context; import android.content.Intent; import android.media.MediaRecorder; import android.os.Environment; import android.os.IBinder; import android.telephony.PhoneStateListener; import android.telephony.TelephonyManager; public class PhoneService extends Service { @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } //在创建服务时,进行一些初始化 @Override public void onCreate() { super.onCreate(); //获取电话管理服务 TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); telephonyManager.listen(new PhoneListener(), PhoneStateListener.LISTEN_CALL_STATE);//通过监听对象对呼叫状态进行监听 } private final class PhoneListener extends PhoneStateListener{ private String incomingNumber; private File file; private MediaRecorder mediaRecorder; //当呼叫状态改变时,调用该方法 @Override public void onCallStateChanged(int state, String incomingNumber) { try { switch (state) { case TelephonyManager.CALL_STATE_RINGING://来电 this.incomingNumber = incomingNumber; break; case TelephonyManager.CALL_STATE_OFFHOOK://接通电话 file = new File(Environment.getExternalStorageDirectory(),incomingNumber+System.currentTimeMillis()); mediaRecorder = new MediaRecorder(); mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);//指定声音来源:话筒,这里只能录打电话的声音,而不能录入传入的声音 //mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//设置音频输出格式 mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);//THREE_GPP);//设置音频输出格式 mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);//设置音频编码格式 mediaRecorder.setOutputFile(file.getAbsolutePath()); mediaRecorder.prepare(); mediaRecorder.start();//开始录音 case TelephonyManager.CALL_STATE_IDLE://挂断电话后回归到空闲状态 if(mediaRecorder!=null) mediaRecorder.stop(); mediaRecorder.release(); mediaRecorder = null; break; } } catch (Exception e) { e.printStackTrace(); } } } } 通过广播接收者进行应用的注册,这里的广播接收者监听的是手机启动的广播 import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; public class BootBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Intent service = new Intent(context,PhoneService.class); context.startService(service);//Intent激活组件(Service) } }

为什么一按录音按钮,显示开始录音接着就结束录音?

package com.cbt.SHDemo; import java.io.File; import java.util.Date; import com.cbt.SHDemo.EnvActivity.BackLoginListener; import android.app.Activity; import android.content.Intent; import android.media.MediaPlayer; import android.media.MediaRecorder; import android.os.Bundle; import android.os.Environment; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnTouchListener; import android.widget.Button; import android.widget.ImageButton; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; public class SleepActivity extends Activity { private MediaPlayer mPlayer = null; public String path = ""; private ImageButton bt_start; private Button play_start; private Button stop_play; private Button exit; private TextView Text_path; private TextView Text_size; private TextView Text_time; private LinearLayout mlinearLayout; private MediaRecorder mediaRecorder = null; Date mdata1; Date mdata2; long time1; long cha; long time2; private boolean isruning = false; // 定义一个布尔类型的变量来监控是否正在录音 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.sleep); bt_start = (ImageButton) findViewById(R.id.start); stop_play = (Button) findViewById(R.id.stop_play); play_start = (Button) findViewById(R.id.start_play); exit = (Button) findViewById(R.id.exit); exit.setOnClickListener(new BackLoginListener()); Text_path = (TextView) findViewById(R.id.textlujing); Text_size = (TextView) findViewById(R.id.textsize); Text_time = (TextView) findViewById(R.id.texttime); mlinearLayout = (LinearLayout) findViewById(R.id.stoplin); mlinearLayout.setVisibility(View.GONE); bt_start.setOnTouchListener(new OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { int i = event.getAction(); switch (i) { case MotionEvent.ACTION_DOWN: Toast.makeText(SleepActivity.this, "开启录音...", Toast.LENGTH_SHORT).show(); mediaRecorder = null; mdata1 = new Date(); time1 = mdata1.getTime(); // 当前时间 System.out.println("当前时间为1:" + time1); record(); break; case MotionEvent.ACTION_UP: if (isruning) { // 如果正在录音 Toast.makeText(SleepActivity.this, "终止录音...", Toast.LENGTH_SHORT).show(); mediaRecorder.stop(); // 停止录音 mediaRecorder.release(); // 释放资源 mlinearLayout.setVisibility(View.VISIBLE); // 可见 information(); mdata2 = new Date(); time2 = mdata2.getTime(); // 当前时间 System.out.println("当前时间为2:" + time2); cha = (time2 - time1) / 1000; System.out.println("时间差为:" + cha + "秒"); Text_time.setText(cha + " 秒"); } break; default: break; } return false; } }); play_start.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { System.out.println("play_start"); Toast.makeText(SleepActivity.this, "播放录音...", Toast.LENGTH_SHORT) .show(); mPlayer = null; startPlaying(); } }); stop_play.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { stopPlaying(); } }); } // 该方法 是用来是实现录音功能并保存到制定文件中 class BackLoginListener implements OnClickListener { @Override public void onClick(View v) { Intent intent = new Intent(); intent.setClass(SleepActivity.this, HomePage.class); startActivity(intent); SleepActivity.this.finish(); } } public void record() { if (mediaRecorder == null) { mediaRecorder = new MediaRecorder(); // 判断是都为空 如果为空new 一个对象 mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); // 设置输入源为麦克风 mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT); // 设置输出格式 mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); // 设置音频的编码 // 默认 // 创建一个临时文件来存储音频 path = Environment.getExternalStorageDirectory().getPath() + "/test_Audio.mp3"; mediaRecorder.setOutputFile(path); // mediaRecorder.getMaxAmplitude() 获取文件的大小 try { mediaRecorder.prepare(); // 准备录音 } catch (Exception e) { e.printStackTrace(); } mediaRecorder.start(); // 开启录音 isruning = true; // 正在录音 } } private void startPlaying() { try { mPlayer = new MediaPlayer(); // 设置要播放的文件 mPlayer.setDataSource(path); mPlayer.prepare(); mPlayer.start(); } catch (Exception e) { mPlayer.release(); e.printStackTrace(); } } // 停止播放 private void stopPlaying() { if (mPlayer == null) { Toast.makeText(SleepActivity.this, "您还没播放任何音频", Toast.LENGTH_SHORT) .show(); } else { mPlayer.release(); mPlayer = null; play_start.setEnabled(true); Toast.makeText(SleepActivity.this, "已终止播放", Toast.LENGTH_SHORT) .show(); } } // 设置文件信息布局information public void information() { File mfile = new File(path); Text_path.setText(path); getFilesize size = new getFilesize(); long msize = size.getFileSize(mfile) / 1024; // 获得文件大小 Text_size.setText(msize + "KB"); } }

关于Android程序闪退的错误日志

编写了一个包含listview的页面,listview基于另外一个activity可以通过按钮进行操作 但是在打开程序时出现了闪退现象,求大神帮忙解读一下错误日志,感谢 04-13 23:39:21.103: D/ResourcesManager(18150): For user 0 new overlays fetched Null 04-13 23:39:21.113: W/System(18150): ClassLoader referenced unknown path: /data/app/com.example.newrecorder-1/lib/arm64 04-13 23:39:21.173: D/AbsListView(18150): Get MotionRecognitionManager 04-13 23:39:21.183: E/MotionRecognitionManager(18150): mSContextService = android.hardware.scontext.ISContextService$Stub$Proxy@23c9d5e 04-13 23:39:21.183: E/MotionRecognitionManager(18150): motionService = com.samsung.android.motion.IMotionRecognitionService$Stub$Proxy@75d53f 04-13 23:39:21.183: E/MotionRecognitionManager(18150): motionService = com.samsung.android.motion.IMotionRecognitionService$Stub$Proxy@75d53f 04-13 23:39:21.183: I/MediaPlayer(18150): Need to enable context aware info 04-13 23:39:21.183: V/MediaPlayer-JNI(18150): native_setup 04-13 23:39:21.193: E/ExtMediaPlayer-JNI(18150): env->IsInstanceOf fails 04-13 23:39:21.193: E/MediaPlayer-JNI(18150): JNIMediaPlayerFactory: bIsQCMediaPlayerPresent 0 04-13 23:39:21.193: E/ExtMediaPlayer-JNI(18150): env->IsInstanceOf fails 04-13 23:39:21.193: E/MediaPlayer-JNI(18150): JNIMediaPlayerFactory: bIsQCMediaPlayerPresent 0 04-13 23:39:21.193: V/MediaPlayer(18150): constructor 04-13 23:39:21.193: V/MediaPlayer(18150): setListener 04-13 23:39:21.193: D/AndroidRuntime(18150): Shutting down VM 04-13 23:39:21.193: E/AndroidRuntime(18150): FATAL EXCEPTION: main 04-13 23:39:21.193: E/AndroidRuntime(18150): Process: com.example.newrecorder, PID: 18150 04-13 23:39:21.193: E/AndroidRuntime(18150): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.newrecorder/com.example.newrecorder.MainActivity}: java.lang.RuntimeException: setAudioSource failed. 04-13 23:39:21.193: E/AndroidRuntime(18150): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3254) 04-13 23:39:21.193: E/AndroidRuntime(18150): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3350) 04-13 23:39:21.193: E/AndroidRuntime(18150): at android.app.ActivityThread.access$1100(ActivityThread.java:223) 04-13 23:39:21.193: E/AndroidRuntime(18150): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794) 04-13 23:39:21.193: E/AndroidRuntime(18150): at android.os.Handler.dispatchMessage(Handler.java:102) 04-13 23:39:21.193: E/AndroidRuntime(18150): at android.os.Looper.loop(Looper.java:148) 04-13 23:39:21.193: E/AndroidRuntime(18150): at android.app.ActivityThread.main(ActivityThread.java:7224) 04-13 23:39:21.193: E/AndroidRuntime(18150): at java.lang.reflect.Method.invoke(Native Method) 04-13 23:39:21.193: E/AndroidRuntime(18150): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 04-13 23:39:21.193: E/AndroidRuntime(18150): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 04-13 23:39:21.193: E/AndroidRuntime(18150): Caused by: java.lang.RuntimeException: setAudioSource failed. 04-13 23:39:21.193: E/AndroidRuntime(18150): at android.media.MediaRecorder._setAudioSource(Native Method) 04-13 23:39:21.193: E/AndroidRuntime(18150): at android.media.MediaRecorder.setAudioSource(MediaRecorder.java:488) 04-13 23:39:21.193: E/AndroidRuntime(18150): at com.example.newrecorder.MainActivity.onCreate(MainActivity.java:57) 04-13 23:39:21.193: E/AndroidRuntime(18150): at android.app.Activity.performCreate(Activity.java:6877) 04-13 23:39:21.193: E/AndroidRuntime(18150): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1136) 04-13 23:39:21.193: E/AndroidRuntime(18150): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3207) 04-13 23:39:21.193: E/AndroidRuntime(18150): ... 9 more 04-13 23:39:23.273: I/Process(18150): Sending signal. PID: 18150 SIG: 9

安卓中内部类调用问题

在外部类方法OnCreate中创建了 new Record();内部类,可是在调用内部类的时候从下面?处就开始报错,为什么呢? java.lang.IllegalStateException异常 @Override public void onCreate() { super.onCreate(); final Record record = new Record(); // 获取电话管理者 TelephonyManager telephonyManager = (TelephonyManager) this .getSystemService(Context.TELEPHONY_SERVICE); PhoneStateListener listener = new PhoneStateListener() { @Override public void onCallStateChanged(int state, String incomingNumber) { // TODO Auto-generated method stub super.onCallStateChanged(state, incomingNumber); switch (state) { case TelephonyManager.CALL_STATE_IDLE: android.util.Log.i("phonelisten", "待机状态"); record.stopRecord(); // Log.INFO(state,"待机状态"); break; case TelephonyManager.CALL_STATE_OFFHOOK: android.util.Log.i("phonelisten", "通话状态"); // 调用phoneRecord();方法来开启录音 if (record.recorder != null) { record.startRecord(); } break; case TelephonyManager.CALL_STATE_RINGING: android.util.Log.i("phonelisten", "响铃状态"); break; default: break; } } }; // 设置监听时间securityExceptions安全问题需要权限 telephonyManager.listen(listener, PhoneStateListener.LISTEN_CALL_STATE); } // 录音写一个内部类 class Record { MediaRecorder recorder= new MediaRecorder(); public void startRecord() { try { recorder.setAudioSource(MediaRecorder.AudioSource.MIC); recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); String str = Environment.getExternalStorageDirectory() + "/receord83.3gp"; recorder.setOutputFile(str); recorder.prepare(); recorder.start(); // Recording is now started } catch (Exception e) { e.printStackTrace(); } } public void stopRecord() { **recorder.stop(); ?????????????????这行开始出错** recorder.reset(); // You can reuse the object by going back to recorder.release(); // Now the object cannot be reused } }

Android拍视频预览的界面被拉伸

最近 Android 需要做一个拍视频保存然后上传的功能,基本功能实现了,但是有一个小 bug,就是预览的时候界面明显被拉长了,但是各种预览设置的参数也都试过了,都没有用,来请教一下。 #代码如下: ##1. Activity ``` public class RecordActivity extends AppCompatActivity implements SurfaceHolder.Callback { private SurfaceView mSurfaceView; private SurfaceHolder mSurfaceHolder; private Button btnStartStop; private boolean isRecording = false; // 标记是否已经在录制 private MediaRecorder mRecorder; // 音视频录制类 private Camera mCamera = null; // 相机 private List<Camera.Size> mSupportedPreviewSizes = null; private Camera.Size mPreviewSize; private Camera.Size mSize = null;// 相机的尺寸 private int mCameraFacing = Camera.CameraInfo.CAMERA_FACING_BACK; // 默认后置摄像头 private static final SparseIntArray orientations = new SparseIntArray(); // 手机旋转对应的调整角度 static { orientations.append(Surface.ROTATION_0, 90); orientations.append(Surface.ROTATION_90, 0); orientations.append(Surface.ROTATION_180, 270); orientations.append(Surface.ROTATION_270, 180); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initWindow(); setContentView(R.layout.activity_record); initViews(); } /** * 初始化窗口 */ private void initWindow() { requestWindowFeature(Window.FEATURE_NO_TITLE); // 去掉标题栏 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); // 设置全屏 // 设置竖屏显示 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); // 选择支持半透明模式,在有 surfaceView 的 activity 中使用。 getWindow().setFormat(PixelFormat.TRANSLUCENT); } /** * 视图对象初始化 */ private void initViews() { mSurfaceView = (SurfaceView) findViewById(R.id.surfaceview); btnStartStop = (Button) findViewById(R.id.btnStartStop); btnStartStop.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (!isRecording) { startRecord(); } else { stopRecord(); } } }); SurfaceHolder holder = mSurfaceView.getHolder(); // 取得holder holder.setFormat(PixelFormat.TRANSPARENT); holder.setKeepScreenOn(true); holder.addCallback(this); // holder加入回调接口 } /** * 初始化相机 */ private void initCamera() { /** * 默认打开后置摄像头 */ if (Camera.getNumberOfCameras() == 2) { mCamera = Camera.open(mCameraFacing); } else { mCamera = Camera.open(); } CameraSizeComparator sizeComparator = new CameraSizeComparator(); Camera.Parameters parameters = mCamera.getParameters(); if (mSize == null) { mSupportedPreviewSizes = parameters.getSupportedPreviewSizes(); Collections.sort(mSupportedPreviewSizes, sizeComparator); for (int num = 0; num < mSupportedPreviewSizes.size(); num++) { Camera.Size size = mSupportedPreviewSizes.get(num); if (size.width >= 1000 && size.height >= 1000) { this.mSize = size; break; } } mSize = mSupportedPreviewSizes.get(0); /** * 增加对聚焦模式的判断 */ List<String> focusModesList = parameters.getSupportedFocusModes(); if (focusModesList.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO)) { parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO); } else if (focusModesList.contains(Camera.Parameters.FOCUS_MODE_AUTO)) { parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO); } mCamera.setParameters(parameters); } int rotation = getWindowManager().getDefaultDisplay().getRotation(); int orientation = orientations.get(rotation); mCamera.setDisplayOrientation(orientation); } @Override protected void onResume() { super.onResume(); initCamera(); } @Override public void onPause() { releaseCamera(); super.onPause(); } /** * 开始录制 */ private void startRecord() { if (mRecorder == null) { mRecorder = new MediaRecorder(); // 创建MediaRecorder } if (mCamera != null) { mCamera.stopPreview(); mCamera.unlock(); mRecorder.setCamera(mCamera); } try { // 设置音频采集方式 mRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); // 设置视频的采集方式 mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); /* mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); // 设置文件的输出格式 mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); // 设置audio的编码格式 mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); // 设置video的编码格式 mRecorder.setVideoEncodingBitRate(10 * 1024 * 1024); // 设置录制的视频编码比特率 mRecorder.setVideoFrameRate(30); // 设置录制的视频帧率 mRecorder.setVideoSize(1920, 1080); // 设置相机分辨率 */ // 设置要捕获的视频的宽度和高度 // mSurfaceHolder.setFixedSize(optimalSize.width, optimalSize.height); mRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH)); // 设置记录会话的最大持续时间(毫秒) mRecorder.setMaxDuration(180 * 1000); mRecorder.setPreviewDisplay(mSurfaceHolder.getSurface()); /** * 获取外部路径,然后将视频保存进去 */ String path = Environment.getExternalStorageDirectory().getPath(); if (path != null) { File dir = new File(path + "/crafts_videos"); if (!dir.exists()) { dir.mkdir(); } /** * 将 currentTimeMillis() 作为文件名 */ path = dir + "/" + System.currentTimeMillis() + ".mp4"; mRecorder.setOutputFile(path); //设置输出文件的路径 mRecorder.prepare(); //准备录制 mRecorder.start(); //开始录制 isRecording = true; btnStartStop.setText("停止"); } } catch (Exception e) { e.printStackTrace(); } } /** * 停止录制 */ private void stopRecord() { try { mRecorder.stop(); // 停止录制 mRecorder.reset(); // 重置 btnStartStop.setText("开始"); } catch (Exception e) { e.printStackTrace(); } isRecording = false; } /** * 释放 MediaRecorder */ private void releaseMediaRecorder() { if (mRecorder != null) { mRecorder.release(); mRecorder = null; } } /** * 释放相机资源 */ private void releaseCamera() { try { if (mCamera != null) { mCamera.stopPreview(); mCamera.setPreviewCallback(null); mCamera.unlock(); mCamera.release(); } } catch (RuntimeException e) { } finally { mCamera = null; } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // 将holder,这个holder为开始在onCreate里面取得的holder,将它赋给mSurfaceHolder mSurfaceHolder = holder; if (mCamera == null) { return; } try { //设置显示 mCamera.setPreviewDisplay(holder); mCamera.startPreview(); } catch (Exception e) { e.printStackTrace(); releaseCamera(); finish(); } } @Override public void surfaceCreated(SurfaceHolder holder) { // 将holder,这个holder为开始在onCreate里面取得的holder,将它赋给mSurfaceHolder mSurfaceHolder = holder; try { mCamera.setPreviewDisplay(mSurfaceHolder); mCamera.startPreview(); } catch (IOException e) { e.printStackTrace(); } } @Override public void surfaceDestroyed(SurfaceHolder holder) { // surfaceDestroyed的时候同时对象设置为null if (isRecording && mCamera != null) { mCamera.lock(); } mSurfaceView = null; mSurfaceHolder = null; releaseMediaRecorder(); releaseCamera(); } private class CameraSizeComparator implements Comparator<Camera.Size> { public int compare(Camera.Size lhs, Camera.Size rhs) { if (lhs.width == rhs.width) { return 0; } else if (lhs.width > rhs.width) { return 1; } else { return -1; } } } } ``` ##2. 布局 ``` <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <SurfaceView android:id="@+id/surfaceview" android:layout_width="match_parent" android:layout_height="match_parent" /> <Button android:id="@+id/btnStartStop" android:layout_width="60dp" android:layout_height="40dip" android:layout_centerHorizontal="true" android:layout_alignParentBottom="true" android:text="开始" /> </RelativeLayout> ``` ##3. 权限 ``` <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> ``` 求大神解答

安卓仿微信语音聊天时,MediaRecorder mMediaRecorder处报错

``` import java.io.File; import java.io.IOException; import java.util.UUID; import android.media.MediaRecorder; import android.util.Log; public class AudioManager { private MediaRecorder mMediaRecorder; private String mDir; private String mCurrentFilePath; private static AudioManager mInstance; private boolean isPrepared = false; public AudioManager(String mDir) { this.mDir = mDir; } /** * 回调准备完毕 * @author lenovo * */ public interface AudioStateListener { void wellPrepared(); } public AudioStateListener mListener; public void setOnAudioStateListener(AudioStateListener mListener) { this.mListener = mListener; } public static AudioManager getInstance(String mDir) { if(mInstance == null) { synchronized (AudioManager.class) { mInstance = new AudioManager(mDir); } } return mInstance; } public void prepareAudio() { try { isPrepared = false; File dir = new File(mDir); if(!dir.exists()) dir.mkdirs(); String fileName = generateName(); File file = new File(dir, fileName); mCurrentFilePath = file.getAbsolutePath(); mMediaRecorder = new MediaRecorder(); //设置输出文件 mMediaRecorder.setOutputFile(file.getAbsolutePath()); //设置音频源为麦克风 mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); //设置音频格式 mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR); //设置音频编码 mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); // mMediaRecorder.setAudioSamplingRate(8000); mMediaRecorder.prepare(); mMediaRecorder.start(); isPrepared = true; if(mListener != null) mListener.wellPrepared(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } private String generateName() { return UUID.randomUUID().toString()+".amr"; } public int getVoiceLevel(int maxLevel) { if(isPrepared) { try { //mMediaRecorder.getMaxAmplitude() 1-32767 //注意此处mMediaRecorder.getMaxAmplitude 只能取一次,如果前面取了一次,后边再取就为0了 return ((mMediaRecorder.getMaxAmplitude()*maxLevel)/32768)+1; } catch (Exception e) { } } return 1; } public void release() { if(mMediaRecorder != null) { mMediaRecorder.stop(); //这里报错 mMediaRecorder.release(); mMediaRecorder = null; } } public void cancel() { release(); //这里也报错 if(mCurrentFilePath != null) { File file = new File(mCurrentFilePath); if(file.exists()) { file.delete(); mCurrentFilePath = null; } } } public String getCurrentFilePath() { return mCurrentFilePath; } } ``` 文件中的两处报错地点我都写上了,希望有大神帮忙解决一下!

Android传输基于socket传输视频文件到pc

我写了一个录制视频的app然后把录制的视频传送到pc端,但是传输到pc端的视频文件变大,而且无法播放,传输方式是DataOutputStream,具体代码如下; package com.example.lenovo.viedoapp; import android.app.Activity; import android.hardware.Camera; import android.media.MediaRecorder; import android.os.Bundle; import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.widget.Button; import com.google.android.gms.common.api.GoogleApiClient; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.OutputStream; import java.net.Socket; import static com.example.lenovo.viedoapp.R.id.surfaceView; public class viedoApp extends Activity implements View.OnClickListener, SurfaceHolder.Callback { Button but_start; Button but_stop; Button but_send; SurfaceView sfv; SurfaceHolder sfh; Camera camera; MediaRecorder mediaRecorder; File videoFile; File aduioFile; Send send; /** * ATTENTION: This was auto-generated to implement the App Indexing API. * See https://g.co/AppIndexing/AndroidStudio for more information. */ private GoogleApiClient client; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_viedo_app); but_start = (Button) findViewById(R.id.but_start); but_start.setOnClickListener(this); but_stop = (Button) findViewById(R.id.but_stop); but_stop.setOnClickListener(this); but_send=(Button)findViewById(R.id.but_send); but_send.setOnClickListener(this); sfv = (SurfaceView) findViewById(surfaceView); sfh = sfv.getHolder(); sfh.addCallback(this); } public void onClick(View v) { if (v.getId() == but_start.getId()) { camera.stopPreview(); camera.release(); camera = null; mediaRecorder = new MediaRecorder(); mediaRecorder.setPreviewDisplay(sfh.getSurface()); mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); mediaRecorder.setVideoSize(320, 240); mediaRecorder.setVideoFrameRate(15); mediaRecorder.setOrientationHint(90); videoFile = new File(getExternalCacheDir(), "video.mp4"); mediaRecorder.setOutputFile(videoFile.getAbsolutePath()); try { mediaRecorder.prepare(); mediaRecorder.start(); //send = new Send(videoFile); //new Thread(send).start(); } catch (IOException e) { e.printStackTrace(); } } else if (v.getId() == but_stop.getId()) { //send.flag = false; mediaRecorder.stop(); mediaRecorder.release(); mediaRecorder = null; camera = Camera.open(); try { camera.setPreviewDisplay(sfh); camera.setDisplayOrientation(90); camera.startPreview(); } catch (IOException e) { e.printStackTrace(); } } else if(v.getId()==but_send.getId()){ send = new Send(videoFile); new Thread(send).start(); // Toast.makeText(viedoApp.this, "完成", Toast.LENGTH_SHORT).show(); } } public void surfaceCreated(SurfaceHolder holder) { camera = Camera.open(); try { camera.setPreviewDisplay(holder); camera.setDisplayOrientation(90); camera.startPreview(); } catch (IOException e) { e.printStackTrace(); } } public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } public void surfaceDestroyed(SurfaceHolder holder) { camera.stopPreview(); camera.release(); camera = null; sfv = null; sfh = null; mediaRecorder = null; } } class Send implements Runnable { Socket socket = null; OutputStream os = null; File file = null; FileInputStream fis = null; byte[] bytes; boolean flag = true; DataOutputStream dos=null; Send(File file) { this.file = file; } public void connect() { try { socket = new Socket("192.168.1.108", 9991); os = socket.getOutputStream(); dos = new DataOutputStream(os); fis= new FileInputStream(file); String a = file.getAbsolutePath(); // Log.d("Send", a); } catch (IOException e) { } bytes = new byte[1024]; long a=0; String b=null; try { while ( fis.read(bytes, 0, bytes.length)>0) { dos.write(bytes,0,bytes.length); dos.flush(); a=(a+bytes.length); } b=a+""; Log.v("Send",b); // Log.v("Send",a.toString()); System.out.print(b); } catch (IOException e) { e.printStackTrace(); } finally{ if(fis!=null){ try { fis.close(); } catch (IOException e) { e.printStackTrace(); } } if(dos!=null){ try { dos.flush(); dos.close(); } catch (IOException e) { e.printStackTrace(); } } } } public void run() { connect(); } } 求求懂得大神给我解答一下,急需

Android调用mediarecorder录制视频,只能录十秒,这个怎么解决

我用Eclipse做了一个视频录制软件,但是这个最多只能录制十秒的视频,调用了mediarecorder方法, public void recorder() { try { myRecAudioFile = File.createTempFile("video", ".3gp",dir); //创建临时文件 recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); //视频源 recorder.setPreviewDisplay(mSurfaceHolder.getSurface()); //预览 recorder.setAudioSource(MediaRecorder.AudioSource.MIC); //录音源为麦克风 recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); //输出格式为3gp recorder.setVideoSize(720, 540); //视频尺寸 recorder.setVideoFrameRate(15); //视频帧频率 recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263); //视频编码 recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); //音频编码 recorder.setMaxDuration(10000); //最大期限 recorder.setOutputFile(myRecAudioFile.getAbsolutePath()); //保存路径 recorder.prepare(); recorder.start(); } catch (IOException e) { e.printStackTrace(); } }

Android 竖屏录制 在PC端播放被逆时针旋转了90度

Android 竖屏录制 在PC端播放被逆时针旋转了90度 mCamera.setDisplayOrientation(90); mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); if (mCameraPosition == 1) mRecorder.setOrientationHint(270);//前置摄像头视频旋转270度 else mRecorder.setOrientationHint(90);//后置摄像头转90 我是用的是源生的录制视频方式,他的方法里不管是旋转摄像头还是旋转录制好的视频,在移动端播放没有问题,但是在后台下载到PC端播放就一直是被逆时针旋转了90度。有大神遇到过这个问题吗,是怎么解决的?

Android 中MediaRecorder+SurfaceView 录制视频的时图像变形

项目需要一个能录制十分钟左右自动停止的功能,找SDK发现满足不了需求,没办法就自己写了 基本都写完了,但是在录制的时候图像会拉伸变形,查了好多资料一直也没有一个好办法,现在 我解决了预览变形的,下面不知道怎么弄了,请教那位大神帮助一下 MediaRecorder配置类 if (!isRecorder && mMediaRecorder == null) { mMediaRecorder = new MediaRecorder(); try { mMediaRecorder.setCamera(mCamera); // 设置从摄像头采集图像 mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); // 设置从麦克风采集声音(或来自录像机的声音AudioSource.CAMCORDER) mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); // 设置视频文件的输出格式 // 必须在设置声音编码格式、图像编码格式之前设置 mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); // mMediaRecorder.setMaxDuration(1000); // 设置图像编码的格式 mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); //mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH)); //Use myVideoSize from above mMediaRecorder.setVideoSize(320, 240); // 设置声音编码的格式 mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); // mMediaRecorder.setOrientationHint(180);// 输出旋转90度,保持竖屏录制 /* * mMediaRecorder.setAudioChannels(1);//1单声道 2 多声道 * mMediaRecorder.setAudioSamplingRate(12500); * //设置录制的音频采样率——频率越高,音质越好 * mMediaRecorder.setAudioEncodingBitRate(16); // 设置录制的音频编码比特率 */ // mMediaRecorder.setOrientationHint(180);// 输出旋转90度,保持竖屏录制 // 每秒 4帧 mMediaRecorder.setVideoFrameRate(30); mMediaRecorder.setVideoEncodingBitRate(10 * 1024 * 1024); // 文件输出路劲 mMediaRecorder.setOutputFile(mVecordFile.getAbsolutePath()); mMediaRecorder.setPreviewDisplay(mHolder.getSurface()); mMediaRecorder.prepare(); // mCamera.startPreview(); mMediaRecorder.start(); } 设置照相机 if (mCamera != null) { freeCameraResource(); } try { mCamera = Camera.open(); if(mCamera != null && isOpenCamera) setCameraParams(); mCamera.startPreview(); mCamera.setDisplayOrientation(0); mCamera.setPreviewDisplay(mHolder); mCamera.unlock(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } // 设置照相机 private void setCameraParams() { // TODO Auto-generated method stub if (mCamera != null) { params = mCamera.getParameters(); WindowManager manager = (WindowManager) VideotTranscribe.this.getSystemService(VideotTranscribe.this.WINDOW_SERVICE); Display display = manager.getDefaultDisplay(); // Point screenResolution = new Point(display.getWidth(), display.getHeight()); //Point p = getBestCameraResolution(params, screenResolution); params.setPreviewSize(display.getWidth(),display.getHeight());//防止录制预览图像变形 mCamera.setParameters(params); params = mCamera.getParameters(); } 跪求大神指导

MediaRecorder录屏,Socket传输录屏内容报错java.lang.IllegalStateException

用模拟器调试可以运行,用真机测试在 mediaRecorder.prepare();抛异常 ``` package www.xjw.com.mymiracast2.screenrecordservice; import android.app.Notification; import android.app.Service; import android.content.Context; import android.content.Intent; import android.hardware.display.DisplayManager; import android.hardware.display.VirtualDisplay; import android.media.MediaRecorder; import android.media.projection.MediaProjection; import android.media.projection.MediaProjectionManager; import android.os.IBinder; import android.os.ParcelFileDescriptor; import java.net.Socket; /** * Created by dzjin on 2018/1/9. */ public class ScreenRecordService extends Service { private int resultCode; private Intent resultData=null; private MediaProjection mediaProjection=null; private MediaRecorder mediaRecorder=null; private VirtualDisplay virtualDisplay=null; private int mScreenWidth; private int mScreenHeight; private int mScreenDensity; private static String filePathName; private Socket receiver = null; private ParcelFileDescriptor pfd = null; private Context context=null; private String host = null; private int port = 8989; @Override public void onCreate() { super.onCreate(); //startForeground(2, new Notification()); } /** * 每次客户端通过调用startService(Intent)显式启动服务时,系统调用startService(Intent), *提供它提供的参数和表示启动请求的唯一整数标记。 * 不要直接调用这个方法。 * @param intent * @param flags * @param startId * @return */ @Override public int onStartCommand(Intent intent, int flags, int startId) { try{ resultCode=intent.getIntExtra("resultCode",-1); resultData=intent.getParcelableExtra("resultData"); mScreenWidth=intent.getIntExtra("mScreenWidth",0); mScreenHeight=intent.getIntExtra("mScreenHeight",0); mScreenDensity=intent.getIntExtra("mScreenDensity",0); filePathName=intent.getStringExtra("filePathName"); host=intent.getStringExtra("host"); port=intent.getIntExtra("port",8989); receiver = new Socket(host, port); pfd = ParcelFileDescriptor .fromSocket(receiver); mediaProjection=createMediaProjection(); mediaRecorder=createMediaRecorder(); virtualDisplay=createVirtualDisplay(); mediaRecorder.start(); }catch (Exception e) { e.printStackTrace(); } /** * START_NOT_STICKY: *从onStartCommand返回的常量(Intent, int, int):如果这个服务的进程是 *在启动时被杀死(从onStartCommand(Intent, int, int)返回后), *没有新的start意图交付给它,然后将服务从 *启动状态,在以后显式调用Context.startService(Intent)之前不要重新创建。 *服务将不会接收带有空意图的onStartCommand(Intent, int, int)调用 *因为如果没有等待交付的意图,它将不会重新启动。 */ return Service.START_NOT_STICKY; } public MediaProjection createMediaProjection(){ /** *使用getSystemService(类)检索MediaProjectionManager实例 *管理媒体放映会议。 */ return ((MediaProjectionManager)getSystemService(Context.MEDIA_PROJECTION_SERVICE)) .getMediaProjection(resultCode,resultData); /** *检索从成功的屏幕捕获请求中获得的MediaProjection。 *如果startActivityForResult()的结果不是RESULT_OK,则*将为null。 */ } private MediaRecorder createMediaRecorder(){ //用于录制音频和视频。录音控制是基于一个简单的状态机。 MediaRecorder mediaRecorder=new MediaRecorder(); //设置要录音的源。 //mediaRecorder.setAudioSource(MediaRecorder. AudioSource.CAMCORDER); //设置要录制的视频源。 mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE); //设置录制过程中产生的输出的格式。 //3GPP媒体文件格式 mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_2_TS); //设置录音格式 //mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); //设置录像编码比特率。 //param:以比特/秒为单位的视频编码比特率 mediaRecorder.setVideoEncodingBitRate(5*mScreenWidth*mScreenHeight); //设置录像编码器用于录像。 mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); //设置要拍摄的视频的宽度和高度。 mediaRecorder.setVideoSize(mScreenWidth,mScreenHeight); //设置要捕获视频的帧速率。 mediaRecorder.setVideoFrameRate(60); try{ mediaRecorder.setOutputFile(pfd.getFileDescriptor()); //mediaRecorder.setOutputFile(filePathName); **此次抛异常** //准备记录器开始捕捉和编码数据。 mediaRecorder.prepare(); }catch (Exception e){ e.printStackTrace(); } return mediaRecorder; } private VirtualDisplay createVirtualDisplay(){ /** *名称字符串:虚拟显示的名称,必须是非空的。这个值不能为空。 width int:虚拟显示的宽度,以像素为单位。必须大于0。 高度int:虚拟显示器的高度,以像素为单位。必须大于0。 dpi int: dpi中虚拟显示的密度。必须大于0。 标志int:虚拟显示标志的组合。有关标志的完整列表,请参见DisplayManager。 surface surface:虚拟显示内容应该呈现到的表面,如果一开始没有,则为null。 回调virtualdisplay。回调:当虚拟显示的状态改变时调用的回调,如果没有,则为空。 处理程序处理程序:应该在其上调用回调的处理程序,如果应该在调用线程的主循环程序上调用回调,则为null。 */ /** * DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR *虚拟显示标志:当没有显示内容时,允许在私有显示上镜像内容。 */ return mediaProjection.createVirtualDisplay("mediaProjection",mScreenWidth,mScreenHeight,mScreenDensity, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,mediaRecorder.getSurface(),null,null); } @Override public void onDestroy() { super.onDestroy(); if(virtualDisplay!=null){ virtualDisplay.release(); virtualDisplay=null; } if(mediaRecorder!=null){ mediaRecorder.stop(); mediaRecorder=null; } if(mediaProjection!=null){ mediaProjection.stop(); mediaProjection=null; } } @Override public IBinder onBind(Intent intent) { System.out.println("==============================="); return null; } } ``` I/MediaRecorder: enter in file frameworks/av/media/libmedia/mediarecorder.cpp, function prepare, line 461 I/IMediaRecorder: prepare (BpMediaRecorder client) in file frameworks/av/media/libmedia/IMediaRecorder.cpp, function prepare, line 249 W/com.mymiracast2: type=1400 audit(0.0:104572): avc: denied { read write } for path="socket:[8870267]" dev="sockfs" ino=8870267 scontext=u:r:mediaserver:s0 tcontext=u:r:untrusted_app:s0:c512,c768 tclass=tcp_socket permissive=0 E/MediaRecorder: prepare failed: -38 W/zygote64: Got a deoptimization request on un-deoptimizable method void android.media.MediaRecorder._prepare() W/System.err: java.lang.IllegalStateException W/System.err: at android.media.MediaRecorder._prepare(Native Method) W/System.err: at android.media.MediaRecorder.prepare(MediaRecorder.java:1017) W/System.err: at www.xjw.com.mymiracast2.screenrecordservice.ScreenRecordService.createMediaRecorder(ScreenRecordService.java:137) W/System.err: at www.xjw.com.mymiracast2.screenrecordservice.ScreenRecordService.onStartCommand(ScreenRecordService.java:79) W/System.err: at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:4151) W/System.err: at android.app.ActivityThread.-wrap21(Unknown Source:0) W/System.err: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2119) W/System.err: at android.os.Handler.dispatchMessage(Handler.java:108) W/System.err: at android.os.Looper.loop(Looper.java:166) W/System.err: at android.app.ActivityThread.main(ActivityThread.java:7529) W/System.err: at java.lang.reflect.Method.invoke(Native Method) W/System.err: at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245) W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921) E/MediaRecorder: SurfaceMediaSource could not be initialized! W/System.err: java.lang.IllegalStateException: failed to get surface at android.media.MediaRecorder.getSurface(Native Method) W/System.err: at www.xjw.com.mymiracast2.screenrecordservice.ScreenRecordService.createVirtualDisplay(ScreenRecordService.java:160) at www.xjw.com.mymiracast2.screenrecordservice.ScreenRecordService.onStartCommand(ScreenRecordService.java:80) W/System.err: at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:4151) at android.app.ActivityThread.-wrap21(Unknown Source:0) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2119) at android.os.Handler.dispatchMessage(Handler.java:108) W/System.err: at android.os.Looper.loop(Looper.java:166) at android.app.ActivityThread.main(ActivityThread.java:7529) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245) W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921) D/StrictMode: StrictMode policy violation; ~duration=7334 ms: android.os.StrictMode$StrictModeNetworkViolation: policy=65543 violation=4 at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1466) at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:356) at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:201) at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:183) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:356) at java.net.Socket.connect(Socket.java:616) at java.net.Socket.connect(Socket.java:565) at java.net.Socket.<init>(Socket.java:445) at java.net.Socket.<init>(Socket.java:217) at www.xjw.com.mymiracast2.screenrecordservice.ScreenRecordService.onStartCommand(ScreenRecordService.java:74) at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:4151) at android.app.ActivityThread.-wrap21(Unknown Source:0) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2119) at android.os.Handler.dispatchMessage(Handler.java:108) at android.os.Looper.loop(Looper.java:166) at android.app.ActivityThread.main(ActivityThread.java:7529) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921) D/StrictMode: StrictMode policy violation; ~duration=7332 ms: android.os.StrictMode$StrictModeNetworkViolation: policy=65543 violation=4 ``` ```

在中国程序员是青春饭吗?

今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...

程序员请照顾好自己,周末病魔差点一套带走我。

程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。

C++(数据结构与算法)78:---分而治之

一、分而治之的思想 分而治之方法与软件设计的模块化方法非常相似 分而治之通常不用于解决问题的小实例,而要解决一个问题的大实例。一般步骤为: ①把一个大实例分为两个或多个更小的实例 ②分别解决每个小实例 ③把这些小实例的解组合成原始大实例的解 二、实际应用之找出假币 问题描述 一个袋子有16个硬币,其中只有一个是假币,这个假币比其他的真币重量轻(其他所有真币的重量都是相同的)...

springboot+jwt实现token登陆权限认证

一 前言 此篇文章的内容也是学习不久,终于到周末有时间码一篇文章分享知识追寻者的粉丝们,学完本篇文章,读者将对token类的登陆认证流程有个全面的了解,可以动态搭建自己的登陆认证过程;对小项目而已是个轻量级的认证机制,符合开发需求;更多精彩原创内容关注公主号知识追寻者,读者的肯定,就是对作者的创作的最大支持; 二 jwt实现登陆认证流程 用户使用账号和面发出post请求 服务器接受到请求后使用私...

技术大佬:我去,你写的 switch 语句也太老土了吧

昨天早上通过远程的方式 review 了两名新来同事的代码,大部分代码都写得很漂亮,严谨的同时注释也很到位,这令我非常满意。但当我看到他们当中有一个人写的 switch 语句时,还是忍不住破口大骂:“我擦,小王,你丫写的 switch 语句也太老土了吧!” 来看看小王写的代码吧,看完不要骂我装逼啊。 private static String createPlayer(PlayerTypes p...

win10暴力查看wifi密码

刚才邻居打了个电话说:喂小灰,你家wifi的密码是多少,我怎么连不上了。 我。。。 我也忘了哎,就找到了一个好办法,分享给大家: 第一种情况:已经连接上的wifi,怎么知道密码? 打开:控制面板\网络和 Internet\网络连接 然后右击wifi连接的无线网卡,选择状态 然后像下图一样: 第二种情况:前提是我不知道啊,但是我以前知道密码。 此时可以利用dos命令了 1、利用netsh wlan...

女程序员,为什么比男程序员少???

昨天看到一档综艺节目,讨论了两个话题:(1)中国学生的数学成绩,平均下来看,会比国外好?为什么?(2)男生的数学成绩,平均下来看,会比女生好?为什么?同时,我又联想到了一个技术圈经常讨...

副业收入是我做程序媛的3倍,工作外的B面人生是怎样的?

提到“程序员”,多数人脑海里首先想到的大约是:为人木讷、薪水超高、工作枯燥…… 然而,当离开工作岗位,撕去层层标签,脱下“程序员”这身外套,有的人生动又有趣,马上展现出了完全不同的A/B面人生! 不论是简单的爱好,还是正经的副业,他们都干得同样出色。偶尔,还能和程序员的特质结合,产生奇妙的“化学反应”。 @Charlotte:平日素颜示人,周末美妆博主 大家都以为程序媛也个个不修边幅,但我们也许...

MySQL数据库面试题(2020最新版)

文章目录数据库基础知识为什么要使用数据库什么是SQL?什么是MySQL?数据库三大范式是什么mysql有关权限的表都有哪几个MySQL的binlog有有几种录入格式?分别有什么区别?数据类型mysql有哪些数据类型引擎MySQL存储引擎MyISAM与InnoDB区别MyISAM索引与InnoDB索引的区别?InnoDB引擎的4大特性存储引擎选择索引什么是索引?索引有哪些优缺点?索引使用场景(重点)...

如果你是老板,你会不会踢了这样的员工?

有个好朋友ZS,是技术总监,昨天问我:“有一个老下属,跟了我很多年,做事勤勤恳恳,主动性也很好。但随着公司的发展,他的进步速度,跟不上团队的步伐了,有点...

我入职阿里后,才知道原来简历这么写

私下里,有不少读者问我:“二哥,如何才能写出一份专业的技术简历呢?我总感觉自己写的简历太烂了,所以投了无数份,都石沉大海了。”说实话,我自己好多年没有写过简历了,但我认识的一个同行,他在阿里,给我说了一些他当年写简历的方法论,我感觉太牛逼了,实在是忍不住,就分享了出来,希望能够帮助到你。 01、简历的本质 作为简历的撰写者,你必须要搞清楚一点,简历的本质是什么,它就是为了来销售你的价值主张的。往深...

程序员写出这样的代码,能不挨骂吗?

当你换槽填坑时,面对一个新的环境。能够快速熟练,上手实现业务需求是关键。但是,哪些因素会影响你快速上手呢?是原有代码写的不够好?还是注释写的不够好?昨夜...

带了6个月的徒弟当了面试官,而身为高级工程师的我天天修Bug......

即将毕业的应届毕业生一枚,现在只拿到了两家offer,但最近听到一些消息,其中一个offer,我这个组据说客户很少,很有可能整组被裁掉。 想问大家: 如果我刚入职这个组就被裁了怎么办呢? 大家都是什么时候知道自己要被裁了的? 面试软技能指导: BQ/Project/Resume 试听内容: 除了刷题,还有哪些技能是拿到offer不可或缺的要素 如何提升面试软实力:简历, 行为面试,沟通能...

优雅的替换if-else语句

场景 日常开发,if-else语句写的不少吧??当逻辑分支非常多的时候,if-else套了一层又一层,虽然业务功能倒是实现了,但是看起来是真的很不优雅,尤其是对于我这种有强迫症的程序"猿",看到这么多if-else,脑袋瓜子就嗡嗡的,总想着解锁新姿势:干掉过多的if-else!!!本文将介绍三板斧手段: 优先判断条件,条件不满足的,逻辑及时中断返回; 采用策略模式+工厂模式; 结合注解,锦...

!大部分程序员只会写3年代码

如果世界上都是这种不思进取的软件公司,那别说大部分程序员只会写 3 年代码,恐怕就没有程序员这种职业。

离职半年了,老东家又发 offer,回不回?

有小伙伴问松哥这个问题,他在上海某公司,在离职了几个月后,前公司的领导联系到他,希望他能够返聘回去,他很纠结要不要回去? 俗话说好马不吃回头草,但是这个小伙伴既然感到纠结了,我觉得至少说明了两个问题:1.曾经的公司还不错;2.现在的日子也不是很如意。否则应该就不会纠结了。 老实说,松哥之前也有过类似的经历,今天就来和小伙伴们聊聊回头草到底吃不吃。 首先一个基本观点,就是离职了也没必要和老东家弄的苦...

2020阿里全球数学大赛:3万名高手、4道题、2天2夜未交卷

阿里巴巴全球数学竞赛( Alibaba Global Mathematics Competition)由马云发起,由中国科学技术协会、阿里巴巴基金会、阿里巴巴达摩院共同举办。大赛不设报名门槛,全世界爱好数学的人都可参与,不论是否出身数学专业、是否投身数学研究。 2020年阿里巴巴达摩院邀请北京大学、剑桥大学、浙江大学等高校的顶尖数学教师组建了出题组。中科院院士、美国艺术与科学院院士、北京国际数学...

为什么你不想学习?只想玩?人是如何一步一步废掉的

不知道是不是只有我这样子,还是你们也有过类似的经历。 上学的时候总有很多光辉历史,学年名列前茅,或者单科目大佬,但是虽然慢慢地长大了,你开始懈怠了,开始废掉了。。。 什么?你说不知道具体的情况是怎么样的? 我来告诉你: 你常常潜意识里或者心理觉得,自己真正的生活或者奋斗还没有开始。总是幻想着自己还拥有大把时间,还有无限的可能,自己还能逆风翻盘,只不是自己还没开始罢了,自己以后肯定会变得特别厉害...

男生更看重女生的身材脸蛋,还是思想?

往往,我们看不进去大段大段的逻辑。深刻的哲理,往往短而精悍,一阵见血。问:产品经理挺漂亮的,有点心动,但不知道合不合得来。男生更看重女生的身材脸蛋,还是...

为什么程序员做外包会被瞧不起?

二哥,有个事想询问下您的意见,您觉得应届生值得去外包吗?公司虽然挺大的,中xx,但待遇感觉挺低,马上要报到,挺纠结的。

当HR压你价,说你只值7K,你该怎么回答?

当HR压你价,说你只值7K时,你可以流畅地回答,记住,是流畅,不能犹豫。 礼貌地说:“7K是吗?了解了。嗯~其实我对贵司的面试官印象很好。只不过,现在我的手头上已经有一份11K的offer。来面试,主要也是自己对贵司挺有兴趣的,所以过来看看……”(未完) 这段话主要是陪HR互诈的同时,从公司兴趣,公司职员印象上,都给予对方正面的肯定,既能提升HR的好感度,又能让谈判气氛融洽,为后面的发挥留足空间。...

面试:第十六章:Java中级开发

HashMap底层实现原理,红黑树,B+树,B树的结构原理 Spring的AOP和IOC是什么?它们常见的使用场景有哪些?Spring事务,事务的属性,传播行为,数据库隔离级别 Spring和SpringMVC,MyBatis以及SpringBoot的注解分别有哪些?SpringMVC的工作原理,SpringBoot框架的优点,MyBatis框架的优点 SpringCould组件有哪些,他们...

早上躺尸,晚上干活:硅谷科技公司这么流行迟到?

硅谷科技公司上班时间OPEN早已不是什么新鲜事,早九晚五是常态,但有很多企业由于不打卡,员工们10点、11点才“姗姗来迟”的情况也屡见不鲜。 这种灵活的考勤制度为人羡慕,甚至近年来,国内某些互联网企业也纷纷效仿。不过,硅谷普遍弹性的上班制度是怎么由来的呢?这种“流行性迟到”真的有那么轻松、悠哉吗? 《动态规划专题班》 课程试听内容: 动态规划的解题要领 动态规划三大类 求最值/计数/可行性 常...

面试阿里p7,被按在地上摩擦,鬼知道我经历了什么?

面试阿里p7被问到的问题(当时我只知道第一个):@Conditional是做什么的?@Conditional多个条件是什么逻辑关系?条件判断在什么时候执...

Python爬虫,高清美图我全都要(彼岸桌面壁纸)

爬取彼岸桌面网站较为简单,用到了requests、lxml、Beautiful Soup4

无代码时代来临,程序员如何保住饭碗?

编程语言层出不穷,从最初的机器语言到如今2500种以上的高级语言,程序员们大呼“学到头秃”。程序员一边面临编程语言不断推陈出新,一边面临由于许多代码已存在,程序员编写新应用程序时存在重复“搬砖”的现象。 无代码/低代码编程应运而生。无代码/低代码是一种创建应用的方法,它可以让开发者使用最少的编码知识来快速开发应用程序。开发者通过图形界面中,可视化建模来组装和配置应用程序。这样一来,开发者直...

面试了一个 31 岁程序员,让我有所触动,30岁以上的程序员该何去何从?

最近面试了一个31岁8年经验的程序猿,让我有点感慨,大龄程序猿该何去何从。

大三实习生,字节跳动面经分享,已拿Offer

说实话,自己的算法,我一个不会,太难了吧

程序员垃圾简历长什么样?

已经连续五年参加大厂校招、社招的技术面试工作,简历看的不下于万份 这篇文章会用实例告诉你,什么是差的程序员简历! 疫情快要结束了,各个公司也都开始春招了,作为即将红遍大江南北的新晋UP主,那当然要为小伙伴们做点事(手动狗头)。 就在公众号里公开征简历,义务帮大家看,并一一点评。《启舰:春招在即,义务帮大家看看简历吧》 一石激起千层浪,三天收到两百多封简历。 花光了两个星期的所有空闲时...

Java岗开发3年,公司临时抽查算法,离职后这几题我记一辈子

前几天我们公司做了一件蠢事,非常非常愚蠢的事情。我原以为从学校出来之后,除了找工作有测试外,不会有任何与考试有关的事儿。 但是,天有不测风云,公司技术总监、人事总监两位大佬突然降临到我们事业线,叫上我老大,给我们组织了一场别开生面的“考试”。 那是一个风和日丽的下午,我翘着二郎腿,左手端着一杯卡布奇诺,右手抓着我的罗技鼠标,滚动着轮轴,穿梭在头条热点之间。 “淡黄的长裙~蓬松的头发...

立即提问
相关内容推荐