آموزش ذخیره تماس در برنامه نویسی اندروید
سلام دوستان در این سری از آموزش برنامه نویسی اندروید به آموزش ذخیره تماس در برنامه نویسی اندروید می پردازیم منظور از ذخیره تماس ذخیره صدا های مکالمه است البته دوستان دقت کنید فقط این یک آموزش کاربردی است هرگونه سو استفاده به عهده خود کاربر می باشد در ادامه با ما همراه باشید.
در اینجاهم ما باید با Broadcast کار کنیم چون باید منتظر باشیم تا زنگی به گوشی ارسال شود سپس ما آن را بگیریم.
در کل با سه بخش کار می کنیم.
- DevicePolicyManager
- Service
- BroadcastReceiver
ابتدا شما باید یک فایل به نام TService درست کنید و کد های زیر را در آن قرار دهید این یک کلاس از نوع جاوا است.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 | public class TService extends Service { MediaRecorder recorder; File audiofile; String name, phonenumber; String audio_format; public String Audio_Type; int audioSource; Context context; private Handler handler; Timer timer; Boolean offHook = false, ringing = false; Toast toast; Boolean isOffHook = false; private boolean recordstarted = false; private static final String ACTION_IN = "android.intent.action.PHONE_STATE"; private static final String ACTION_OUT = "android.intent.action.NEW_OUTGOING_CALL"; private CallBr br_call; @Override public IBinder onBind(Intent arg0) { // TODO Auto-generated method stub return null; } @Override public void onDestroy() { Log.d("service", "destroy"); super.onDestroy(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { // final String terminate =(String) // intent.getExtras().get("terminate");// // intent.getStringExtra("terminate"); // Log.d("TAG", "service started"); // // TelephonyManager telephony = (TelephonyManager) // getSystemService(Context.TELEPHONY_SERVICE); // TelephonyManager // // object // CustomPhoneStateListener customPhoneListener = new // CustomPhoneStateListener(); // telephony.listen(customPhoneListener, // PhoneStateListener.LISTEN_CALL_STATE); // context = getApplicationContext(); final IntentFilter filter = new IntentFilter(); filter.addAction(ACTION_OUT); filter.addAction(ACTION_IN); this.br_call = new CallBr(); this.registerReceiver(this.br_call, filter); // if(terminate != null) { // stopSelf(); // } return START_NOT_STICKY; } public class CallBr extends BroadcastReceiver { Bundle bundle; String state; String inCall, outCall; public boolean wasRinging = false; @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(ACTION_IN)) { if ((bundle = intent.getExtras()) != null) { state = bundle.getString(TelephonyManager.EXTRA_STATE); if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) { inCall = bundle.getString(TelephonyManager.EXTRA_INCOMING_NUMBER); wasRinging = true; Toast.makeText(context, "IN : " + inCall, Toast.LENGTH_LONG).show(); } else if (state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)) { if (wasRinging == true) { Toast.makeText(context, "ANSWERED", Toast.LENGTH_LONG).show(); String out = new SimpleDateFormat("dd-MM-yyyy hh-mm-ss").format(new Date()); File sampleDir = new File(Environment.getExternalStorageDirectory(), "/TestRecordingDasa1"); if (!sampleDir.exists()) { sampleDir.mkdirs(); } String file_name = "Record"; try { audiofile = File.createTempFile(file_name, ".amr", sampleDir); } catch (IOException e) { e.printStackTrace(); } String path = Environment.getExternalStorageDirectory().getAbsolutePath(); recorder = new MediaRecorder(); // recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL); recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_COMMUNICATION); recorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB); recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); recorder.setOutputFile(audiofile.getAbsolutePath()); try { recorder.prepare(); } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } recorder.start(); recordstarted = true; } } else if (state.equals(TelephonyManager.EXTRA_STATE_IDLE)) { wasRinging = false; Toast.makeText(context, "REJECT || DISCO", Toast.LENGTH_LONG).show(); if (recordstarted) { recorder.stop(); recordstarted = false; } } } } else if (intent.getAction().equals(ACTION_OUT)) { if ((bundle = intent.getExtras()) != null) { outCall = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER); Toast.makeText(context, "OUT : " + outCall, Toast.LENGTH_LONG).show(); } } } } } |
یک کلاس دیگر به نام DeviceAdminDemo.java ایجاد کنید.
1 2 3 4 5 6 7 8 9 10 | public class DeviceAdminDemo extends DeviceAdminReceiver { @Override public void onReceive(Context context, Intent intent) { super.onReceive(context, intent); } public void onEnabled(Context context, Intent intent) { }; public void onDisabled(Context context, Intent intent) { }; } |
یکسری حالت رو می تونید در بالا بررسی کنید که مثلا کاربر حالت accessibility را فعال کرده یا نه
دسترسی ها را به AndroidManifest.xml اضافه کرده
1 2 3 4 5 | <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.STORAGE" /> |
یک پوشه به نام xml در ریشه res ایجاد کنید سپس در آن یک فایل به نام my_admin.xml ایجاد کرده و کد زیر را در آن قرار دهید.
1 2 3 4 5 | <device-admin xmlns:android="http://schemas.android.com/apk/res/android" > <uses-policies> <force-lock /> </uses-policies> </device-admin> |
و سپس receiver و service خودمان رو ریجستر می کنیم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <receiver android:name=".DeviceAdminDemo" android:description="@string/device_description" android:label="@string/device_admin_label" android:permission="android.permission.BIND_DEVICE_ADMIN" > <meta-data android:name=".device_admin" android:resource="@xml/my_admin" /> <intent-filter> <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" /> <action android:name="android.app.action.DEVICE_ADMIN_DISABLED" /> <action android:name="android.app.action.DEVICE_ADMIN_DISABLE_REQUESTED" /> </intent-filter> </receiver> <service android:name=".TService" > </service> |
کد مربوط به MainActivity.java هم همانند زیر می شود.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | public class MainActivity extends Activity { private static final int REQUEST_CODE = 0; private DevicePolicyManager mDPM; private ComponentName mAdminName; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); try { // Initiate DevicePolicyManager. mDPM = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE); mAdminName = new ComponentName(this, DeviceAdminDemo.class); if (!mDPM.isAdminActive(mAdminName)) { Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN); intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, mAdminName); intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "Click on Activate button to secure your application."); startActivityForResult(intent, REQUEST_CODE); } else { // mDPM.lockNow(); // Intent intent = new Intent(MainActivity.this, // TrackDeviceService.class); // startService(intent); } } catch (Exception e) { e.printStackTrace(); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (REQUEST_CODE == requestCode) { Intent intent = new Intent(MainActivity.this, TService.class); startService(intent); } } } |
این آموزش هم به پایان رسید
موفق و موید باشید.
با عرض سلام و خسته نباشید
تشکر بابت آموزش خوبتون.یه جا آموزش بدست آوردن شماره موبایل از طریق کد بود ولی جواب نمیداد.اگه ممکنه شما آموزشش رو بذارین
سپاس
امکان به دست آوردن شماره موبایل از اندروید 2.2 به بعد در اندروید بسته شده است. و در صورتی که گوشی کاربر روت باشد می توان آن را به دست آورد موفق باشید.
درود
ممنون از پاسختان، خب برای گوشی های روت به چه صورته؟ از طریق telephonyMAnager میشه؟
من خودم گوشیم روت هست و طبق یه آموزش زبان اصلی رفتم جلو ولی شماره رو نشون نداد.گوشیم هم 2 سیم کارت هست
از کد زیر استفاده کنید.
یادتان نرود دسترسی زیر را اضافه کنید.
البته یک کدی هم بود که یک نفر اذعان داشت می شود با استفاده از دسترسی به اس ام اس ها شماره تلفن را بدون روت به دست آورد البته این کد تست نشده است ولی بررسی کنید شاید درست گفته باشد.
و دسترسی مربوط به آن
موفق باشید.