使用隐式意图时如何在我的代码中解决ActivityNotFoundException?

时间:2017-07-16 14:39:41

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

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说“没有找到活动处理意图”。如何解决这个问题。

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

2 个答案:

答案 0 :(得分:3)

以下列方式更改您的代码

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;
        }
    }

答案 1 :(得分:-1)

当您在Android的Custom Built ROMs上进行测试时会发生这种情况。 这是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);

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

上面的代码说明了软件包名称,您可以通过在手机应用程序管理器中查看它来定义手机应用程序的软件包名称。