联系人选取器中的联系号码不正确 - Android

时间:2017-08-02 08:04:26

标签: java android android-contacts contactpicker

我正在使用联系人选择器将号码输入editText。根据用户保存特定号码的方式,保存的联系号码可以是三种类型。

  1. +911234567899(以+ 91为前缀)[India CountryCode]。
  2. 01234567899(前缀为0)[用于呼叫手机号码的常用STD代码]。
  3. 1234567899(不带任何前缀)。
  4. 我需要删除前缀(如果有的话)并获取没有空格的实际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";
            }
    
        }
    }
    

3 个答案:

答案 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