کد بدون نقص نرم افزار ضبط صدا در کاتلین: MainActivity.kt
در پی کد منبع بدون نقص نرم افزار ابتدایی ضبط صدا طراحی اپلیکیشن در مشهد را مشاهده میکنید:
1package com.example.android.soundrecorder
2
3import android.Manifest
4import android.annotation.SuppressLint
5import android.annotation.TargetApi
6import android.content.pm.PackageManager
7import android.media.MediaRecorder
8import android.Operating System.Build
9import android.support.v7.app.AppCompatActivity
10import android.Operating System.Bundle
11import android.Operating System.Environment
12import android.support.v4.app.ActivityCompat
13import android.support.v4.content.ContextCompat
14import android.widget.Toast
15import kotlinx.android.synthetic.main.activity_main.*
16import java.io.IOException
17
18class MainActivity : AppCompatActivity() {
19
20 private var output: String? = null
21 private var mediaRecorder: MediaRecorder? = null
22 private var state: Boolean = false
23 private var recordingStopped: Boolean = false
24
25 override fun onCreate(savedInstanceState: Bundle?) {
26 super.onCreate(savedInstanceState)
27 setContentView(R.layout.activity_main)
28
29 mediaRecorder = MediaRecorder()
30 output = Environment.getExternalStorageDirectory().absolutePath + "/recording.mp3"
31
32 mediaRecorder?.setAudioSource(MediaRecorder.AudioSource.MIC)
33 mediaRecorder?.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4)
34 mediaRecorder?.setAudioEncoder(MediaRecorder.AudioEncoder.AAC)
35 mediaRecorder?.setOutputFile(output)
36
37 button_start_recording.setOnClickListener {
38 if (ContextCompat.checkSelfPermission(this,
39 Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(this,
40 Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
41 val permissions = arrayOf(android.Manifest.permission.RECORD_AUDIO, android.Manifest.permission.WRITE_EXTERNAL_STORAGE, android.Manifest.permission.READ_EXTERNAL_STORAGE)
42 ActivityCompat.requestPermissions(this, permissions,0)
43 } else {
44 startRecording()
45 }
46 }
47
48 button_stop_recording.setOnClickListener{
49 stopRecording()
50 }
51
52 button_pause_recording.setOnClickListener {
53 pauseRecording()
54 }
55 }
56
57 private fun startRecording() {
58 try {
59 mediaRecorder?.prepare()
60 mediaRecorder?.start()
61 state = true
62 Toast.makeText(this, "Recording started!", Toast.LENGTH_SHORT).show()
63 } catch (e: IllegalStateException) {
64 e.printStackTrace()
65 } catch (e: IOException) {
66 e.printStackTrace()
67 }
68 }
69
70 @SuppressLint("RestrictedApi", "SetTextI18n")
71 @TargetApi(Build.VERSION_CODES.N)
72 private fun pauseRecording() {
73 if(state) {
74 if(!recordingStopped){
75 Toast.makeText(this,"Stopped!", Toast.LENGTH_SHORT).show()
76 mediaRecorder?.pause()
77 recordingStopped = true
78 button_pause_recording.text = "Resume"
79 }else{
80 resumeRecording()
81 }
82 }
83 }
84
85 @SuppressLint("RestrictedApi", "SetTextI18n")
86 @TargetApi(Build.VERSION_CODES.N)
87 private fun resumeRecording() {
88 Toast.makeText(this,"Resume!", Toast.LENGTH_SHORT).show()
89 mediaRecorder?.resume()
90 button_pause_recording.text = "Pause"
91 recordingStopped = false
92 }
93
94 private fun stopRecording(){
95 if(state){
96 mediaRecorder?.stop()
97 mediaRecorder?.release()
98 state = false
99 }else{
100 Toast.makeText(this, "You are not recording right now!", Toast.LENGTH_SHORT).show()
101 }
102 }
103}
مشاهده بی نقص کدها
نظارت فولدر صدا
بعد از ضبط کردن صدا بایستی به یاد داخلی دستگاه اندرویدی خویش بروید تا بتوانید به فولدر ضبط گردیده گوش بدهید. در صورتیکه درباره ی مسیر این شغل مطمئن نیستید، روند شغل را درپی توضیح دادهایم:
نرم افزار file را روی دستگاه اندرویدی خویش گشوده فرمائید.
به قسمت local بروید.
بهدنبال فایلی با اسم recording.mp3 بگردید.
حرف نهایی
به این ترتیب به نقطه پايان این راهنما با قضیه نرم افزار مقدماتی ضبط صدا در کاتلین رسیدیم. اکنون شما با نحوه فعالیت MediaRecorder آشنا گردیدهاید و می دانید که چه طور می توانید به طور همزمان تقاضای دسترسی بکنید و چرا این فعالیت اساسی میباشد. همینطور نکاتی را راجعبه خاطر داخلی دستگاه اندرویدی و طرز ذخیرهسازی دادهها در آن آموختید. ورژن توسعه یافتهتری از این نرم افزار که مجهز به تجهیزات بیشتری مانند پخش صدای ضبط گردیده با به کارگیری از MediaPlayer میباشد را میتوانید درین ریپوی گیتهاب (+) ببینید.
دیباگ کرش نیتیو (Native Crash) در اندروید – راهنمای توسعه یافته
100 نرم افزار بلندتر در لیست دوست داستنیترین نرم افزارهای اندرویدی تا مجال کتابت این نوشتهعلمی بیش تر از 54 میلیارد توشه نصب گردیدهاند. 85 درصد از این نرم افزارها دارنده کد «نیتیو» (native) با به کارگیری از بیش تر از 1000 کتابخانه نیتیو می باشند. در حالتی که تجربیات فعالیت روی اینگونه نرم افزارها یا این که هر نرم افزار بلندمرتبه دیگری را داشته باشید، میدانید که احتمال بروز کرش نیتیو بسیار بالا میباشد.
توسعه و گسترشدهندگان اندروید میبایست در قضیه دیباگ کردن «رد پشته» (Stack Trace) کرش نیتیو که در لهجه اندرویدی «سنگ قبر» (Tombstone) نامیده میگردد، تجربیات قابل قبولی داشته باشند. ولی کرش نرم افزار در قسمت نیتیو (یعنی در کدهای سطح تحت C یا این که ++C) در اکثر وقت ها مورد ها بغرنج و ادراک آن مشقت بار میباشد. افزون بر آن قابلیت و امکان از شغل افتادن JVM (ماشین مجازی جاوا) قبل از رجوع در اختیار گرفتن به کد جاوا/کاتلین نیز وجود دارااست. این بدان معنا میباشد که شما قابلیت فراهم نمودن «استثنا» (Exception) را در سطح نرم افزار نخواهید داشت و تجربیات کاربری ناخوشایندی رقم میخورد.
قبل از شروع
مستندات پیشرفتدهندگان اندروید داده ها اثرگذار متعددی در زمینه ی عیبیابی کرش نیتیو (+) ارائه نموده است، ولی مکان نمونههای جامع و مفیدی که به تفهیم عالی مسئله یاری دهد، خالی میباشد.
کلیک نمائید
نکته: در حالتیکه با کد نیتیو روی پلتفرم اندروید شناخت ندارید، خوب میباشد آغاز راهنمای NDK اندروید (+) را پژوهش نمایید.
کتابخانههای نیتیو در اکثری از نرم افزارها موثر میباشند؛ البته بعضا از کاربردهای آن ها به تفصیل تحت میباشد:
فایدهگیری از سطح ها بالاتری از همت دستگاه چهت نیل به تأخیر تحت یا این که اجرای نرم افزارهای هنگفت از نگاه محاسبات مانند بازی یا این که مشابهسازیهای فیزیکی.
به کار گیری دوباره از کتابخانههای C یا این که ++C که از سوی شما یا این که بسطدهندگان دیگر پیشرفتهاند.
به علاوه کتابخانههای نیتیو قادرند امنیت نرم افزار را ارتقاء دهند و میتوانند در نرم افزارهایی که برای پلتفرمهای متعدد نوشته میگردند، آیتم استعمال قرار گیرند.
نمونههایی از دنیای حقیقی و واقعی
فکر کنید در یک گروه Android SDK سرگرم به شغل می باشید که در پروژه خویش با کتابخانه فرد ثالثی راز و شغل دارید که دربرگیرنده کدهای نیتیو میباشد. اشیای مشترک (پوشههای so.) نیز به طور pre-obfuscated میباشند که موجب میشود دیباگ کردن هر سیرتکامل کرش مشقت بار باشد.
شاید کتابخانه مشترکی که در نرم افزار شما گنجانده گردیده، از قبلی obfuscated باشد و میبایست از obfuscation دوباره دوری نمائید. درصورتیکه از obfuscation دوباره پرهیز نکنید، احتمال بالایی وجود دارااست که با ایراد مواجه گردید.
در طول یکدستسازی این کتابخانه با نرم افزار، در حالتی که با یک کرش در runtime در build-های release مواجه گردید که obfuscation شدهاست، عملاً با شرایط بسیار دشواری روبرو گردیدهاید. Obfuscation کد برای محافظت امنیت نرم افزار ضروری میباشد و از این رو بایستی کرش را تخت گاز قبل از تکثیر آتی رفع فرمایید.
دراین مورد ها می بایست یک چاره برای دیباگ کردن نرم افزار بیابید. به نرم افزار مثال بی آلایش ذیل دقت نمایید. فرآیند آنالیز و دیباگ کردن برای رفع کرش نیتیو درین نرم افزار مصرف شدهاند.
کد بدون نقص نرم افزار ضبط صدا در کاتلین: MainActivity.kt
در پی کد منبع بدون نقص نرم افزار ابتدایی ضبط صدا طراحی اپلیکیشن در مشهد را مشاهده میکنید:
1package com.example.android.soundrecorder
2
3import android.Manifest
4import android.annotation.SuppressLint
5import android.annotation.TargetApi
6import android.content.pm.PackageManager
7import android.media.MediaRecorder
8import android.Operating System.Build
9import android.support.v7.app.AppCompatActivity
10import android.Operating System.Bundle
11import android.Operating System.Environment
12import android.support.v4.app.ActivityCompat
13import android.support.v4.content.ContextCompat
14import android.widget.Toast
15import kotlinx.android.synthetic.main.activity_main.*
16import java.io.IOException
17
18class MainActivity : AppCompatActivity() {
19
20 private var output: String? = null
21 private var mediaRecorder: MediaRecorder? = null
22 private var state: Boolean = false
23 private var recordingStopped: Boolean = false
24
25 override fun onCreate(savedInstanceState: Bundle?) {
26 super.onCreate(savedInstanceState)
27 setContentView(R.layout.activity_main)
28
29 mediaRecorder = MediaRecorder()
30 output = Environment.getExternalStorageDirectory().absolutePath + "/recording.mp3"
31
32 mediaRecorder?.setAudioSource(MediaRecorder.AudioSource.MIC)
33 mediaRecorder?.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4)
34 mediaRecorder?.setAudioEncoder(MediaRecorder.AudioEncoder.AAC)
35 mediaRecorder?.setOutputFile(output)
36
37 button_start_recording.setOnClickListener {
38 if (ContextCompat.checkSelfPermission(this,
39 Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(this,
40 Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
41 val permissions = arrayOf(android.Manifest.permission.RECORD_AUDIO, android.Manifest.permission.WRITE_EXTERNAL_STORAGE, android.Manifest.permission.READ_EXTERNAL_STORAGE)
42 ActivityCompat.requestPermissions(this, permissions,0)
43 } else {
44 startRecording()
45 }
46 }
47
48 button_stop_recording.setOnClickListener{
49 stopRecording()
50 }
51
52 button_pause_recording.setOnClickListener {
53 pauseRecording()
54 }
55 }
56
57 private fun startRecording() {
58 try {
59 mediaRecorder?.prepare()
60 mediaRecorder?.start()
61 state = true
62 Toast.makeText(this, "Recording started!", Toast.LENGTH_SHORT).show()
63 } catch (e: IllegalStateException) {
64 e.printStackTrace()
65 } catch (e: IOException) {
66 e.printStackTrace()
67 }
68 }
69
70 @SuppressLint("RestrictedApi", "SetTextI18n")
71 @TargetApi(Build.VERSION_CODES.N)
72 private fun pauseRecording() {
73 if(state) {
74 if(!recordingStopped){
75 Toast.makeText(this,"Stopped!", Toast.LENGTH_SHORT).show()
76 mediaRecorder?.pause()
77 recordingStopped = true
78 button_pause_recording.text = "Resume"
79 }else{
80 resumeRecording()
81 }
82 }
83 }
84
85 @SuppressLint("RestrictedApi", "SetTextI18n")
86 @TargetApi(Build.VERSION_CODES.N)
87 private fun resumeRecording() {
88 Toast.makeText(this,"Resume!", Toast.LENGTH_SHORT).show()
89 mediaRecorder?.resume()
90 button_pause_recording.text = "Pause"
91 recordingStopped = false
92 }
93
94 private fun stopRecording(){
95 if(state){
96 mediaRecorder?.stop()
97 mediaRecorder?.release()
98 state = false
99 }else{
100 Toast.makeText(this, "You are not recording right now!", Toast.LENGTH_SHORT).show()
101 }
102 }
103}
مشاهده بی نقص کدها
نظارت فولدر صدا
بعد از ضبط کردن صدا بایستی به یاد داخلی دستگاه اندرویدی خویش بروید تا بتوانید به فولدر ضبط گردیده گوش بدهید. در صورتیکه درباره ی مسیر این شغل مطمئن نیستید، روند شغل را درپی توضیح دادهایم:
نرم افزار file را روی دستگاه اندرویدی خویش گشوده فرمائید.
به قسمت local بروید.
بهدنبال فایلی با اسم recording.mp3 بگردید.
حرف نهایی
به این ترتیب به نقطه پايان این راهنما با قضیه نرم افزار مقدماتی ضبط صدا در کاتلین رسیدیم. اکنون شما با نحوه فعالیت MediaRecorder آشنا گردیدهاید و می دانید که چه طور می توانید به طور همزمان تقاضای دسترسی بکنید و چرا این فعالیت اساسی میباشد. همینطور نکاتی را راجعبه خاطر داخلی دستگاه اندرویدی و طرز ذخیرهسازی دادهها در آن آموختید. ورژن توسعه یافتهتری از این نرم افزار که مجهز به تجهیزات بیشتری مانند پخش صدای ضبط گردیده با به کارگیری از MediaPlayer میباشد را میتوانید درین ریپوی گیتهاب (+) ببینید.
دیباگ کرش نیتیو (Native Crash) در اندروید – راهنمای توسعه یافته
100 نرم افزار بلندتر در لیست دوست داستنیترین نرم افزارهای اندرویدی تا مجال کتابت این نوشتهعلمی بیش تر از 54 میلیارد توشه نصب گردیدهاند. 85 درصد از این نرم افزارها دارنده کد «نیتیو» (native) با به کارگیری از بیش تر از 1000 کتابخانه نیتیو می باشند. در حالتی که تجربیات فعالیت روی اینگونه نرم افزارها یا این که هر نرم افزار بلندمرتبه دیگری را داشته باشید، میدانید که احتمال بروز کرش نیتیو بسیار بالا میباشد.
توسعه و گسترشدهندگان اندروید میبایست در قضیه دیباگ کردن «رد پشته» (Stack Trace) کرش نیتیو که در لهجه اندرویدی «سنگ قبر» (Tombstone) نامیده میگردد، تجربیات قابل قبولی داشته باشند. ولی کرش نرم افزار در قسمت نیتیو (یعنی در کدهای سطح تحت C یا این که ++C) در اکثر وقت ها مورد ها بغرنج و ادراک آن مشقت بار میباشد. افزون بر آن قابلیت و امکان از شغل افتادن JVM (ماشین مجازی جاوا) قبل از رجوع در اختیار گرفتن به کد جاوا/کاتلین نیز وجود دارااست. این بدان معنا میباشد که شما قابلیت فراهم نمودن «استثنا» (Exception) را در سطح نرم افزار نخواهید داشت و تجربیات کاربری ناخوشایندی رقم میخورد.
قبل از شروع
مستندات پیشرفتدهندگان اندروید داده ها اثرگذار متعددی در زمینه ی عیبیابی کرش نیتیو (+) ارائه نموده است، ولی مکان نمونههای جامع و مفیدی که به تفهیم عالی مسئله یاری دهد، خالی میباشد.
کلیک نمائید
نکته: در حالتیکه با کد نیتیو روی پلتفرم اندروید شناخت ندارید، خوب میباشد آغاز راهنمای NDK اندروید (+) را پژوهش نمایید.
کتابخانههای نیتیو در اکثری از نرم افزارها موثر میباشند؛ البته بعضا از کاربردهای آن ها به تفصیل تحت میباشد:
فایدهگیری از سطح ها بالاتری از همت دستگاه چهت نیل به تأخیر تحت یا این که اجرای نرم افزارهای هنگفت از نگاه محاسبات مانند بازی یا این که مشابهسازیهای فیزیکی.
به کار گیری دوباره از کتابخانههای C یا این که ++C که از سوی شما یا این که بسطدهندگان دیگر پیشرفتهاند.
به علاوه کتابخانههای نیتیو قادرند امنیت نرم افزار را ارتقاء دهند و میتوانند در نرم افزارهایی که برای پلتفرمهای متعدد نوشته میگردند، آیتم استعمال قرار گیرند.
نمونههایی از دنیای حقیقی و واقعی
فکر کنید در یک گروه Android SDK سرگرم به شغل می باشید که در پروژه خویش با کتابخانه فرد ثالثی راز و شغل دارید که دربرگیرنده کدهای نیتیو میباشد. اشیای مشترک (پوشههای so.) نیز به طور pre-obfuscated میباشند که موجب میشود دیباگ کردن هر سیرتکامل کرش مشقت بار باشد.
شاید کتابخانه مشترکی که در نرم افزار شما گنجانده گردیده، از قبلی obfuscated باشد و میبایست از obfuscation دوباره دوری نمائید. درصورتیکه از obfuscation دوباره پرهیز نکنید، احتمال بالایی وجود دارااست که با ایراد مواجه گردید.
در طول یکدستسازی این کتابخانه با نرم افزار، در حالتی که با یک کرش در runtime در build-های release مواجه گردید که obfuscation شدهاست، عملاً با شرایط بسیار دشواری روبرو گردیدهاید. Obfuscation کد برای محافظت امنیت نرم افزار ضروری میباشد و از این رو بایستی کرش را تخت گاز قبل از تکثیر آتی رفع فرمایید.
دراین مورد ها می بایست یک چاره برای دیباگ کردن نرم افزار بیابید. به نرم افزار مثال بی آلایش ذیل دقت نمایید. فرآیند آنالیز و دیباگ کردن برای رفع کرش نیتیو درین نرم افزار مصرف شدهاند.

راهکارهای کاهش CPC در کمپینها