Java 没有拨出电话号码
我正在从呼叫记录器开发android应用程序。在清单文件中,我正在使用电话状态权限,但无法访问传出呼叫,我收到空指针异常 明显的Java 没有拨出电话号码,java,android,Java,Android,我正在从呼叫记录器开发android应用程序。在清单文件中,我正在使用电话状态权限,但无法访问传出呼叫,我收到空指针异常 明显的 public class CallReceiver extends BroadcastReceiver { MediaRecorder recorder; TelephonyManager telManager; boolean recordStarted; private Context ctx; static boolea
public class CallReceiver extends BroadcastReceiver {
MediaRecorder recorder;
TelephonyManager telManager;
boolean recordStarted;
private Context ctx;
static boolean status = false;
String phoneNumber;
public static SharedPreferences preferences;
boolean enabled;
private static Date date;
public static Boolean isIncoming;
private static String dateStr;
@Override
public void onReceive(Context context, Intent intent) {
ctx = context;
String action = intent.getAction();
preferences = context.getSharedPreferences("Numbers", Context.MODE_PRIVATE);
enabled = preferences.getBoolean("enabled", false);
date = new Date();
dateStr = date.getHours() + ":" + date.getMinutes() + ":" + date.getSeconds();
if (enabled) {
if (status == false) {
try {
recorder = new MediaRecorder();
} catch (Exception ex) {
ex.printStackTrace();
}
Bundle extras = intent.getExtras();
if (extras != null) {
String state = extras.getString(TelephonyManager.EXTRA_STATE);
if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) {
phoneNumber = extras.getString(TelephonyManager.EXTRA_INCOMING_NUMBER);
incomingcallrecord(action, context);
} else if (state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)) {
phoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
incomingcallrecord(action, context);
}
}
} else {
status = false;
}
}
}
private void incomingcallrecord(String action, Context context) {
// TODO Auto-generated method stub
if (action.equals("android.intent.action.PHONE_STATE")) {
telManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
telManager.listen(phoneListener, PhoneStateListener.LISTEN_CALL_STATE);
}
}
private final PhoneStateListener phoneListener = new PhoneStateListener() {
@Override
public void onCallStateChanged(int state, String incomingNumber) {
Log.d("calling number", "calling number" + incomingNumber);
try {
switch (state) {
case TelephonyManager.CALL_STATE_RINGING: {
Log.e("CALL_STATE_RINGING", "CALL_STATE_RINGING");
isIncoming = true;
recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL);
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
Log.e("incoming", "incoming call" + incomingNumber);
File file = createDirIfNotExists();
recorder.setOutputFile(file.getAbsolutePath());
recorder.prepare();
Thread.sleep(1000);
recorder.start();
recordStarted = true;
status = true;
Log.e("Record start", " Start");
String insertStr = "IN_" + dateStr;
ContentValues values = new ContentValues();
values.put(CallRecorderSQLite.FeedEntry.COLUMN_2_NUMBER, insertStr);
Activity_Landing.dbWritable.insert(CallRecorderSQLite.FeedEntry.TABLE_NAME, null, values);
Log.d("calling number ringing", "" + incomingNumber);
break;
}
case TelephonyManager.CALL_STATE_OFFHOOK: {
Log.e("CALL_STATE_OFFHOOK", "CALL_STATE_OFFHOOK");
isIncoming = false;
recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL);
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
Log.e("outgoing", "outgoing call" + incomingNumber);
File file = createDirIfNotExists();
recorder.setOutputFile(file.getAbsolutePath());
recorder.prepare();
Thread.sleep(1000);
recorder.start();
recordStarted = true;
status = true;
Log.e("Record start", " Start");
String insertStr = "OUT_" + dateStr;
ContentValues values = new ContentValues();
values.put(CallRecorderSQLite.FeedEntry.COLUMN_2_NUMBER, insertStr);
Activity_Landing.dbWritable.insert(CallRecorderSQLite.FeedEntry.TABLE_NAME, null, values);
Log.d("calling number offhook", "" + incomingNumber);
break;
}
case TelephonyManager.CALL_STATE_IDLE: {
Log.e("CALL_STATE_IDLE", "CALL_STATE_IDLE");
if (recordStarted) {
recorder.stop();
recorder.reset();
recorder.release();
Log.e("Record stop", " stop");
recorder = null;
recordStarted = false;
}
Log.d("calling number idle", "" + incomingNumber);
break;
}
default: {
}
}
} catch (Exception ex) {
Log.e("Exception ------", "" + ex.toString());
}
}
};
public File createDirIfNotExists() {
File folder = new File(Environment.getExternalStorageDirectory() + "/PhoneCallRecording");
if (!folder.exists()) {
if (!folder.mkdirs()) {
Log.e("TravellerLog :: ", "folder is created");
}
}
File file;
if (isIncoming) {
file = new File(folder, "IN_" + dateStr + ".amr");
} else {
file = new File(folder, "OUT_" + dateStr + ".amr");
}
try {
if (!file.exists()) {
if (file.createNewFile()) {
Log.e("TravellerLog :: ", "file is created");
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return file;
}
}
将清单更改为:
<receiver android:name=".Receiver.CallReceiver">
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE"></action>
</intent-filter>
</receiver>
据此,
}发布您的代码,以便我们检查您所做的这是我的清单文件@PreetikaKaur添加了我的接收代码。请检查一下。可能是重复的
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
<receiver android:name=".MyPhoneReceiver" >
<intent-filter>
<action android:name="android.intent.action.NEW_OUTGOING_CALL" />
</intent-filter>
</receiver>
...
@Override public void onReceive(final Context context, final Intent intent) {
if (Intent.ACTION_NEW_OUTGOING_CALL.equals(intent.getAction())) {
final String originalNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
}
...
public class CallReceiver extends BroadcastReceiver {
MediaRecorder recorder;
TelephonyManager telManager;
boolean recordStarted;
private Context ctx;
static boolean status = false;
String phoneNumber;
public static SharedPreferences preferences;
boolean enabled;
private static Date date;
Boolean isIncoming;
String isInOrOut;
private static String dateStr;
static long start_time, end_time;
String lastCallnumber;
@Override
public void onReceive(Context context, Intent intent) {
ctx = context;
String action = intent.getAction();
preferences = context.getSharedPreferences("Numbers", Context.MODE_PRIVATE);
enabled = preferences.getBoolean("enabled", false);
date = new Date();
dateStr = date.getHours() + ":" + date.getMinutes() + ":" + date.getSeconds();
if (enabled) {
if (status == false) {
try {
recorder = new MediaRecorder();
} catch (Exception ex) {
ex.printStackTrace();
}
Bundle extras = intent.getExtras();
if (extras != null) {
String state = extras.getString(TelephonyManager.EXTRA_STATE);
if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) {
incomingcallrecord(action, context);
} else if (state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)) {
incomingcallrecord(action, context);
}
}
} else {
status = false;
}
}
}
private void incomingcallrecord(String action, Context context) {
// TODO Auto-generated method stub
if (action.equals("android.intent.action.PHONE_STATE")) {
telManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
telManager.listen(phoneListener, PhoneStateListener.LISTEN_CALL_STATE);
}
}
private final PhoneStateListener phoneListener = new PhoneStateListener() {
@Override
public void onCallStateChanged(int state, String incomingNumber) {
Log.d("calling number", "calling number" + incomingNumber);
try {
switch (state) {
case TelephonyManager.CALL_STATE_RINGING: {
Log.e("CALL_STATE_RINGING", "CALL_STATE_RINGING");
isIncoming = true;
recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL);
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
Log.e("incoming", "incoming call" + incomingNumber);
phoneNumber = incomingNumber;
File file = createDirIfNotExists();
recorder.setOutputFile(file.getAbsolutePath());
recorder.prepare();
Thread.sleep(1000);
recorder.start();
recordStarted = true;
status = true;
Log.e("Record start", " Start");
Log.d("calling number ringing", "" + incomingNumber);
break;
}
case TelephonyManager.CALL_STATE_OFFHOOK: {
Log.e("CALL_STATE_OFFHOOK", "CALL_STATE_OFFHOOK");
isIncoming = false;
recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL);
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
Log.e("outgoing", "outgoing call" + lastCallnumber);
File file = createDirIfNotExists();
recorder.setOutputFile(file.getAbsolutePath());
recorder.prepare();
Thread.sleep(1000);
recorder.start();
recordStarted = true;
status = true;
Log.e("Record start", " Start");
Log.d("calling number offhook", "" + lastCallnumber);
break;
}
case TelephonyManager.CALL_STATE_IDLE: {
Log.e("CALL_STATE_IDLE", "CALL_STATE_IDLE");
if (recordStarted) {
recorder.stop();
recorder.reset();
recorder.release();
Log.e("Record stop", " stop");
recorder = null;
recordStarted = false;
}
if (isIncoming) {
isInOrOut = "in";
ContentValues values = new ContentValues();
values.put(CallRecorderSQLite.FeedEntry.COLUMN_1_TIME, dateStr);
values.put(CallRecorderSQLite.FeedEntry.COLUMN_2_NUMBER, phoneNumber);
values.put(CallRecorderSQLite.FeedEntry.COLUMN_3_INOUT, isInOrOut);
Activity_Landing.dbWritable.insert(CallRecorderSQLite.FeedEntry.TABLE_NAME, null, values);
} else {
isInOrOut = "out";
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
Log.i("CallLogDetailsActivity", "Getting Log activity...");
String[] projection = new String[]{CallLog.Calls.NUMBER};
if (ActivityCompat.checkSelfPermission(ctx, Manifest.permission.READ_CALL_LOG) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
return;
}
Cursor cur = ctx.getContentResolver().query(CallLog.Calls.CONTENT_URI, projection, null, null, CallLog.Calls.DATE + " desc");
cur.moveToFirst();
lastCallnumber = cur.getString(0);
ContentValues values = new ContentValues();
values.put(CallRecorderSQLite.FeedEntry.COLUMN_1_TIME, dateStr);
values.put(CallRecorderSQLite.FeedEntry.COLUMN_2_NUMBER, lastCallnumber);
values.put(CallRecorderSQLite.FeedEntry.COLUMN_3_INOUT, isInOrOut);
Activity_Landing.dbWritable.insert(CallRecorderSQLite.FeedEntry.TABLE_NAME, null, values);
}
}, 500);
}
Log.d("calling number idle", "" + incomingNumber);
break;
}
default: {
}
}
} catch (Exception ex) {
Log.e("Exception ------", "" + ex.toString());
}
}
};
public File createDirIfNotExists() {
File folder = new File(Environment.getExternalStorageDirectory() + "/PhoneCallRecording");
if (!folder.exists()) {
if (!folder.mkdirs()) {
Log.e("TravellerLog :: ", "folder is created");
}
}
File file = new File(folder, dateStr + ".amr");
try {
if (!file.exists()) {
if (file.createNewFile()) {
Log.e("TravellerLog :: ", "file is created");
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return file;
}