如何在Android应用中获取用户的电话号码?

时间:2017-01-11 13:11:14

标签: android location

我搜索从Facebook SDK获取电话号码,我知道这是不可能的。 我的问题是,有什么办法可以从谷歌SDK获取用户电话号码吗?

另外,我如何获得用户的地址信息?

1 个答案:

答案 0 :(得分:0)

Facebook' Android的应用程序在Android帐户管理器中创建一个帐户。如果用户通过输入他们的电话号码登录(到FB应用程序),您将能够将Facebook注册的电话号码保存为帐户名称。

转到设置 - >帐户 - > Facebook

在这里,您将看到以下3个中的任何一个 - >

1)用于在Android上登录Facebook App的电子邮件ID

2)用于在Android上登录Facebook App的电话号码

3)用户ID - 每个用户的唯一ID。例如,马克扎克伯格的身份证是' zuck' (来自https://www.facebook.com/zuck)。

现在,诀窍在于让用户接受'联系人'允许。一旦你有了联系人'权限(不要忘记将“帐户”权限添加到您的清单中)您可以使用 android.accounts.AccountManager 类访问所有帐户数据(包括Facebook) )。

AccountManager am = AccountManager.get(this);
    Account[] accounts = am.getAccounts();
    for (Account ac : accounts) {
        String accountType = ac.type;
        if (accountType.equals("com.facebook.auth.login")) {
            String usrDataStr = accountType + "-->" + ac.name;
            Toast.makeText(this, usrDataStr, Toast.LENGTH_LONG).show();
        }
    }

您可以使用上面的代码来遍历Android设备上的帐户。上述代码基本上检查设备上是否存在Facebook帐户并获取相关数据。

经过一番研究,我意识到如果用户在登录页面输入了电话号码,Facebook会将用户的电话号码设置为帐号。但是,如果他/她使用电子邮件或用户ID,则将其设置为帐户名称。

根据我的经验,我注意到大多数人倾向于使用他们的电话号码登录。因此,您很有可能使用此技术获取用户的电话号码。

因此,如果您正在开发一个寻找偷偷摸摸的方式来获取用户联系信息的应用(例如,在获取电话号码的用例中),这种方法很有用。无义务的)。这不是获得用户电话号码的保证方式,一旦知道这可能是安全漏洞,Facebook可能会停止暴露此类用户信息。此外,该号码可能属于另一个设备。

我曾向Facebook报告此问题,但得到了安全团队的答复,这是预期的行为,并且它仅用于跨应用程序通信/非敏感信息&#34;。< / p>

查看示例代码:https://github.com/umangmathur92/FacebookVulnerabilityProof

问题的第二部分......

您可以使用&#39; FusedLocationApi&#39;获取用户的位置坐标来获取用户的地址。谷歌播放服务,然后使用位置请求的结果,即地理坐标,通过使用&#39;地理编码器&#39;来获取可能的地址列表。类。

1)在onCreate / onCreateView函数中:

GoogleApiClient mGoogleApiClient = return new GoogleApiClient.Builder(getContext())
                .addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() {
                    @Override
                    public void onConnected(@Nullable Bundle bundle) {
                    }

                    @Override
                    public void onConnectionSuspended(int i) {
                    }
                })
                .addOnConnectionFailedListener(new GoogleApiClient.OnConnectionFailedListener() {
                    @Override
                    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
                    }
                })
                .addApi(LocationServices.API)
                .build();
            mGoogleApiClient.connect();
                LocationRequest mLocationRequest = new LocationRequest();
                LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder();
                builder.addLocationRequest(mLocationRequest);
                LocationSettingsRequest mLocationSettingsRequest = builder.build();

                PendingResult<LocationSettingsResult> result = LocationServices.SettingsApi.checkLocationSettings(mGoogleApiClient, mLocationSettingsRequest);
                result.setResultCallback(new ResultCallback<LocationSettingsResult>() {
                    @Override
                    public void onResult(@NonNull LocationSettingsResult locationSettingsResult) {
                        final Status status = locationSettingsResult.getStatus();
                        switch (status.getStatusCode()) {
                            case LocationSettingsStatusCodes.SUCCESS:
                                Log.i(MY_LOG, "All location settings are satisfied.");
                                getLocation();
                                break;
                            case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                                Log.i(MY_LOG, "Location settings are not satisfied. Show the user a dialog to upgrade location settings ");
                                break;
                            case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                                Log.i(MY_LOG, "Location settings are inadequate, and cannot be fixed here. Dialog not created.");
                                break;
                        }
                    }
                });

2)&#39; getLocation&#39;功能:

private void getLocation() {
        mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
        if (mLastLocation != null) {
            userProfile.setLatitude(mLastLocation.getLatitude());
            userProfile.setLongitude(mLastLocation.getLongitude());
            AsyncTask<Location, String, List<Address>> reverseGeoCodeTask = getReverseGeoCodeAsyncTask();
            reverseGeoCodeTask.execute(mLastLocation);
        }
    }

3)反向地理编码AsyncTask:

private AsyncTask<Location, String, List<Address>> getReverseGeoCodeAsyncTask() {
        return new AsyncTask<Location, String, List<Address>>() {

            @Override
            protected List<Address> doInBackground(Location... locations) {
                Geocoder geocoder = new Geocoder(getContext(), Locale.getDefault());
                try {
                    return geocoder.getFromLocation(locations[0].getLatitude(), locations[0].getLongitude(), 1);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                return null;
            }

            @Override
            protected void onPostExecute(List<Address> addresses) {
                super.onPostExecute(addresses);
                if (Utils.notNullOrEmpty(addresses)) {
                    Address address = addresses.get(0);
                    address.getPostalCode();
                    address.getLocality();
                    address.getAdminArea();
                }
            }
        };
    }

注意:为了简洁起见,我跳过了涉及权限检查和错误处理的代码的某些部分。