java - TelephonyManager.EXTRA_INCOMING_NUMBER 在 android 9 中为 null

标签 java android xml android-intent android-9.0-pie

<分区>

我无法在 Android 9 设备中使用 TelephonyManager.EXTRA_INCOMING_NUMBER 获取来电电话号码。它总是空的。我已在我的 list 文件中添加了所需的权限。

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_CALL_LOG"/>

////

<receiver android:name="packagename" android:enabled="true" >
        <intent-filter>
            <action android:name="android.intent.action.PHONE_STATE" />

        </intent-filter>
</receiver>

////

 public void onReceive(final Context context, Intent intent) {

    Log.d(" onReceive: ", "flag1");

    String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);

    if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)
            || state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)) {

        Log.d("Ringing", "Phone is ringing");

        Intent i = new Intent(context, MainActivity.class);
        i.putExtras(intent);
        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | 
Intent.FLAG_ACTIVITY_CLEAR_TOP);

        context.startActivity(i);
    }
}

在上面的 onReceive() 方法中,我访问了手机的状态,一切顺利..

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    try {

        if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.SYSTEM_ALERT_WINDOW) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(MainActivity.this,
                    new String[]{Manifest.permission.READ_PHONE_STATE, Manifest.permission.SYSTEM_ALERT_WINDOW},
                    1);
        }
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        l1=(LinearLayout)findViewById(R.id.l1);
        l1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                finishAndRemoveTask();
                android.os.Process.killProcess(android.os.Process.myPid());
            }
        });
         number = getIntent().getStringExtra(
                TelephonyManager.EXTRA_INCOMING_NUMBER);


         if (number.substring(0,1).equalsIgnoreCase("+")){
            number=number.substring(3);
            Log.e("bbbb",number);
         }
        String state = getIntent().getStringExtra(
                TelephonyManager.EXTRA_STATE);
        progressBarf = (ProgressBar)findViewById(R.id.progressBar1);
        mobile_number = (TextView) findViewById(R.id.mobile_number);
        vechile = (TextView) findViewById(R.id.vechile);
        name=(TextView)findViewById(R.id.name);
        name.setText("Searching");
        mobile_number.setText(number);
        close=(ImageView)findViewById(R.id.close);
         db = new DatabaseHandler(this);
        if (ConnectionDetector.isConnectingToInternet(MainActivity.this)) {
            makeJsonArrayRequest();

        }else{
            Pojo pp= db.getContact(number);
            progressBarf.setVisibility(View.GONE);
            Toast.makeText(getApplicationContext(),"Get From Offline",Toast.LENGTH_SHORT).show();
            if (pp.getS_vechile().equals("0")){
                name.setText(pp.getS_name());
            }else {
                name.setText(pp.getS_name());
                vechile.setText("("+pp.getS_vechile()+")");
            }
            Log.e("dayalen","aa"+String.valueOf(db.getContactsCount()));
        }
        startService(new Intent(this, UpdateService.class));
        Calendar cal = Calendar.getInstance();
        Intent intent = new Intent(this, UpdateService.class);
        PendingIntent pintent = PendingIntent
                .getService(this, 0, intent, 0);

        AlarmManager alarm = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        // Start service every hour
        alarm.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(),
                3600*1000, pintent);
        close.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finishAndRemoveTask();
                android.os.Process.killProcess(android.os.Process.myPid());
            }
        });
    }
    catch (Exception e) {
        Log.d("Exception", e.toString());
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

在这里,TelephonyManager.EXTRA_INCOMING_NUMBER 在调用时给出 null。但实际上它应该返回调用者的电话号码。

最佳答案

你快到了。您缺少的是 READ_CALL_LOG 运行时权限。您需要请求运行时许可,就像您为 READ_PHONE_STATE 所做的那样。

关于java - TelephonyManager.EXTRA_INCOMING_NUMBER 在 android 9 中为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55296561/

相关文章:

android - 在 Android SQLite 中,直接使用 Cursor 比创建模型对象更节省内存?

android - 如何从网站中选择 TextView 作为android Web View 中的默认 TextView ?

c# linq to xml 错误 : cannot implicitly convert type

xml - 在 Visual Basic 中解析 XML

Java Bean 和包装类

java - 标记非数据库字段 @Transient 与范围 JPA 实体?

java - 启动/停止和打开/关闭等分组功能是否违反单一职责原则?

密码字段的 Android 切换按钮无法正常工作

java - 使用 STax 在 Java 中解析 XML

java - maven 。设置 java.library.path