【问题标题】:How to resolve ActivityNotFoundException in my code when using implicit intents?使用隐式意图时如何在我的代码中解决 ActivityNotFoundException?
【发布时间】:2017-07-16 14:39:41
【问题描述】:

MainActivity.java

public class MainActivity extends AppCompatActivity {


    EditText edit;
    Button btn;
    boolean b = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        edit = (EditText) findViewById(R.id.phone);
        btn = (Button) findViewById(R.id.call);

        permissionRequest();


        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                if (b == false)
                {

                    permissionRequest();
                }

                else
                    {

                        if (edit.getText().toString().equals(" "))
                    {
                        Toast.makeText(MainActivity.this, "Enter the number first", Toast.LENGTH_LONG).show();
                    }
                    else
                        {
                        Intent i = new Intent(Intent.ACTION_CALL);
                        i.setData(Uri.parse(edit.getText().toString()));
                        startActivity(i);   //This line is coming in red
                    }
                }
            }
        });
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

        switch (requestCode) {
            case 1:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    b = true;
                } else {

                    b = false;
                }
        }


    }

    void permissionRequest() {

        if (ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CALL_PHONE}, 1);
        }
    }
}

清单文件:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.ankit.dialer">
<uses-permission android:name="android.permission.CALL_PHONE"/>
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

在这里,我正在创建一个应用程序来拨打电话。问题是,当我启动应用程序时,它会请求许可,但在我提供许可后,单击按钮会显示 ActivityNotFoundException 说“没有找到处理 Intent 的活动”。如何解决这个问题。

此外,我的startActivity(i) 下划线为红色,表示“调用需要权限,可能会被用户拒绝”,但程序正在编译和执行良好,但是当程序在单击按钮时崩溃,然后在 android 监视器中显示异常是由这一行。

【问题讨论】:

  • 显示堆栈跟踪
  • 还提供您用于setData() 的值。 ACTION_CALL 通常需要一个以tel: 为前缀的电话号码。

标签: android android-intent android-permissions phone-call


【解决方案1】:

按以下方式更改您的代码

btn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) 
    {
        Intent i = new Intent(Intent.ACTION_CALL);
        i.setData(Uri.parse("tel:" + edit.getText().toString()));
        startActivity(i);   //This line is coming in red          

        if (ActivityCompat.checkSelfPermission(this, 
        Manifest.permission.CALL_PHONE) != 
        PackageManager.PERMISSION_GRANTED) 
        {

            /**********************
             * 
             *     WRITE UR CODE INSIDE THIS BLOCK TO HANDLE SITUATION WHEN
                 THE APP IS NOT GRANTED " ACTION_CALL" PERMISSION
             * /

            return;
        }
    }

【讨论】:

    【解决方案2】:

    当您在适用于 Android 的自定义构建 ROM 上进行测试时会发生这种情况。 这是 Cyanogenmod 和 Lineage OS 面临的最常见问题。

    String contact_number="123456789";
    Intent callIntent = new Intent(Intent.ACTION_CALL);
    intent.setPackage("com.android.phone");
    callIntent.setData(Uri.parse("tel:" + contact_number));
    startActivity(callIntent);
    

    为用户提供选择电话应用程序的选项,您正在测试的设备上可能有一些不同的电话应用程序,例如 hangoutstruecaller 或任何其他.

    上面的代码说明了包名,你可以通过在手机应用管理器中查看来定义手机应用的包名。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-31
      • 1970-01-01
      相关资源
      最近更新 更多