我正在使用联系人选择器将号码输入editText。根据用户保存特定号码的方式,保存的联系号码可以是三种类型。
我需要删除前缀(如果有的话)并获取没有空格的实际10位数字到我的editText(有些设备在数字之间放置空格以便更好地阅读)。
现在我面临的问题是,这只适用于你第一次选择每种类型的联系人,比如,它会在你第一次选择一个前缀数字和非前缀数字时工作。下次你尝试时,它不会像我需要的那样工作。但是,如果我们重新启动应用程
这是代码:
ScreenMain.java
import android.Manifest;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.net.Uri;
import android.provider.ContactsContract;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
public class ScreenMain extends AppCompatActivity {
private static final int PERMISSION_ALL = 1;
ImageButton btnGetNumber;
EditText etMobileNumber;
private String sMobileNumber = "";
private Uri uriContact;
private String contactID; // contacts unique ID
private static ScreenMain inst;
public static ScreenMain instance() {
return inst;
}
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_screen_main);
btnGetData = (Button) findViewById(R.id.btndGetStatus);
etMobileNumber = (EditText) findViewById(R.id.etdMobileNumber);
String[] PERMISSIONS = { Manifest.permission.READ_CONTACTS,
Manifest.permission.WRITE_CONTACTS,
};
ActivityCompat.requestPermissions(this, PERMISSIONS, PERMISSION_ALL);
etMobileNumber.setOnClickListener(new View.OnClickListener()
{
public void onClick(View view)
{
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
}
});
btnGetNumber.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// using native contacts selection
// Intent.ACTION_PICK = Pick an item from the data, returning what was selected.
startActivityForResult(new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI), REQUEST_CODE_PICK_CONTACTS);
}
});
btnGetData.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
// sendSms("mONST");
ClassSMS.sendSms(getApplicationContext(),"mONST",etMobileNumber.getText().toString());
}
});
btnCall.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
// ClassMakeCall.makeCall(getApplicationContext(),etMobileNumber.getText().toString());
String ssMobNumber = etMobileNumber.getText().toString();
if (ssMobNumber.length() == 0) {
Toast.makeText(getApplicationContext(), " Please enter mobile number in the motorON unit", Toast.LENGTH_SHORT).show();
return;
}
if (ssMobNumber.length() != 10) {
Toast.makeText(getApplicationContext(), " Invalid mobile number", Toast.LENGTH_SHORT).show();
return;
}
try {
Intent callIntent = new Intent(Intent.ACTION_CALL);
callIntent.setData(Uri.parse("tel:+91" + ssMobNumber));
if (ActivityCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
Toast.makeText(getApplicationContext()," SMS Fail, Please goto Settings -> APPS -> motorON -> Permissions and enable SMS permission ", Toast.LENGTH_SHORT).show();
return;
}
startActivity(callIntent);
} catch (ActivityNotFoundException activityException) {
Toast.makeText(getApplicationContext()," unable to make call", Toast.LENGTH_SHORT).show();
}
}
});
ivSettings.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(getApplicationContext(), ScreenSettings.class));
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE_PICK_CONTACTS && resultCode == RESULT_OK) {
// Log.d(TAG, "Response: " + data.toString());
uriContact = data.getData();
ClassGetPhoneNumber.retrieveContactNumber(getApplicationContext(),uriContact);
if(ClassGetPhoneNumber.sStatus.equals("OK"))
{
etMobileNumber.setText(ClassGetPhoneNumber.sResponse);
}
}
}
@Override
protected void onStart() {
super.onStart();
inst = this;
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
}
@Override
protected void onRestart(){
super.onRestart();
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
// Log.d(TAG, "atvt restart");
}
@Override
protected void onResume(){
super.onResume();
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
// Log.d(TAG, "atvt resume");
}
@Override
protected void onPause(){
super.onPause();
// Log.d(TAG, "atvt pause");
}
@Override
protected void onStop(){
super.onStop();
// Log.d(TAG, "atvt stop");
}
@Override
protected void onDestroy()
{
super.onDestroy();
// Log.d(TAG, "atvt destroy");
}
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults)
{
switch (requestCode)
{
case PERMISSION_ALL:
{
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED)
{
}
else
{
Toast.makeText(getApplicationContext()," App Needs SMS Permission to Work ", Toast.LENGTH_SHORT).show();
}
return;
}
}
}
}
ClassGetPhoneNumber.java
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.provider.ContactsContract;
import android.util.Log;
class ClassGetPhoneNumber
{
private static final String TAG = null ;
public static String sStatus="ERROR";
public static String sResponse;
public static String sContactNumber;
public static String sContactNumberFinal;
public static int With91 = 0, With0 = 0, TenDigit = 0, InvalidNumber = 0;
public static String contactID=""; // contacts unique ID
public static String contactNumber = null;
public static void retrieveContactNumber(Context context, Uri uriContact)
{
// getting contacts ID
Cursor cursorID = context.getContentResolver().query(uriContact,
new String[]{ContactsContract.Contacts._ID},
null, null, null);
if (cursorID.moveToFirst()) {
contactID = cursorID.getString(cursorID.getColumnIndex(ContactsContract.Contacts._ID));
}
cursorID.close();
// Using the contact ID now we will get contact phone number
Cursor cursorPhone = context.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
new String[]{ContactsContract.CommonDataKinds.Phone.NUMBER},
ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ? AND " +
ContactsContract.CommonDataKinds.Phone.TYPE + " = " +
ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE,
new String[]{contactID},
null);
contactNumber = null;
if (cursorPhone.moveToFirst()) {
contactNumber = cursorPhone.getString(cursorPhone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
}
cursorPhone.close();
sResponse = null;
sContactNumber = null;
sContactNumberFinal = null;
sContactNumber = contactNumber.replaceAll("\\s","");
int iLength = sContactNumber.length();
if(iLength==13)
With91 = 1;
if(iLength==11)
With0 = 1;
if(iLength==10)
TenDigit = 1;
if(With91 == 1)
{
sContactNumberFinal = sContactNumber.substring(3);
Log.e(TAG,"In With91, sContactNumberFinal : "+sContactNumberFinal);
sResponse = sContactNumberFinal;
sStatus = "OK";
}
if (With0 == 1)
{
sContactNumberFinal = sContactNumber.substring(1);
Log.e(TAG,"In With0, sContactNumberFinal : "+sContactNumberFinal);
sResponse = sContactNumberFinal;
sStatus = "OK";
}
if (TenDigit == 1)
{
sContactNumberFinal = sContactNumber;
Log.e(TAG,"In TenDigit, sContactNumberFinal : "+sContactNumberFinal);
sResponse = sContactNumberFinal;
sStatus = "OK";
}
}
}
答案 0 :(得分:1)
我同意@DaveyDaveDave静态字段不是要走的路,但是如果你坚持这里是相同的代码,有很多修复和简化的代码。 请注意,仅从API 16及更高版本支持NORMALIZED_NUMBER。
class ClassGetPhoneNumber {
...
public static void retrieveContactNumber(Context context, Uri uriContact) {
sResponse = null;
sContactNumber = null;
sContactNumberFinal = null;
// get contactID from contactUri
long contactID = ContentUris.parseId(contactUri);
// Using the contact ID now we will get contact phone number
// Don't add selection by Phone.TYPE as we might miss a lot of phones.
// We ask for the normalized number, this will only work for API 16 and above
Cursor cursorPhone = context.getContentResolver().query(CommonDataKinds.Phone.CONTENT_URI,
new String[]{CommonDataKinds.Phone.NORMALIZED_NUMBER, CommonDataKinds.Phone.NUMBER},
CommonDataKinds.Phone.CONTACT_ID + " = " + contactID,null,null);
contactNumber = null;
if (cursorPhone != null && cursorPhone.moveToFirst()) {
contactNumber = cursorPhone.getString(0); // this number will always be of e164 format: "+<country><local number>"
Log.d(TAG, "normalized number: " + contactNumber + ", original number: " + cursorPhone.getString(1) + ", contact-id: " + contactID);
} else {
// you need to quit here, otherwise you'll be using an old value of contactNumber in the rest of the code.
if (cursorPhone != null) {
cursorPhone.close();
}
return;
}
cursorPhone.close();
if (!TextUtils.isEmpty(contactNumber)) {
sContactNumber = contactNumber;
sContactNumberFinal = sContactNumber.substring(3);
sResponse = sContactNumberFinal;
sStatus = "OK";
} else {
// no phone was found
sStatus = "NOT FOUND";
}
}
}
答案 1 :(得分:0)
很难关注你的代码,因为有很多事情要发生,但我认为根本原因是ClassGetPhoneNumber
类中的所有内容都是静态的,所以该类中的字段设置在第一个传递,下次调用retrieveContactNumber
方法时,它们的值仍然存在。
通过观察,我怀疑它并不像第一次工作那么简单而不是随后工作,而是根据输入你会得到一般“奇怪”的行为。
最简单的解决方案是从static
类中删除所有ClassGetPhoneNumber
个关键字,并从以下位置更改来电:
ClassGetPhoneNumber.retrieveContactNumber(getApplicationContext(),uriContact);
为:
new ClassGetPhoneNumber().retrieveContactNumber(getApplicationContext(),uriContact);
我认为这将解决您遇到的直接问题。
答案 2 :(得分:0)
我明白了。
问题是:
我用来确定用户如何保存的变量的值
特定数字(With91,With0,TenDigit)在开始时未初始化为零
retrieveContactNumber()方法。
在函数开始时将它们初始化为零会清除其之前的值
值并使其按预期工作。
感谢大家的时间和支持。
-Paul Varghese