Приложение Android для вызова номера при нажатии кнопки
Я хочу вызвать число, указанное в текстовом поле, но я получаю сообщение об ошибке:
Приложение "xyz" (процесс com.android) неожиданно остановилось
Ниже приведен мой код. Где это происходит?
EditText txtPhn;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button callButton = (Button)findViewById(R.id.btnCall);
txtPhn = (EditText)findViewById(R.id.txtPhnNumber);
callButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
try {
Intent callIntent = new Intent(Intent.ACTION_CALL);
callIntent.setData(Uri.parse("tel:"+txtPhn.getText().toString()));
startActivity(callIntent);
} catch (ActivityNotFoundException activityException) {
Log.e("Calling a Phone Number", "Call failed", activityException);
}
}
});
}
EDITED LogCat
03-09 11:23:25.874: ERROR/AndroidRuntime(370): FATAL EXCEPTION: main
03-09 11:23:25.874: ERROR/AndroidRuntime(370): java.lang.SecurityException: Permission Denial: starting Intent { act=android.intent.action.CALL dat=tel:xxx-xxx-xxxx flg=0x10000000 cmp=com.android.phone/.OutgoingCallBroadcaster } from ProcessRecord{40738d70 370:org.krish.android/10034} (pid=370, uid=10034) requires android.permission.CALL_PHONE
03-09 11:23:25.874: ERROR/AndroidRuntime(370): at android.os.Parcel.readException(Parcel.java:1322)
03-09 11:23:25.874: ERROR/AndroidRuntime(370): at android.os.Parcel.readException(Parcel.java:1276)
03-09 11:23:25.874: ERROR/AndroidRuntime(370): at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:1351)
03-09 11:23:25.874: ERROR/AndroidRuntime(370): at android.app.Instrumentation.execStartActivity(Instrumentation.java:1374)
03-09 11:23:25.874: ERROR/AndroidRuntime(370): at android.app.Activity.startActivityForResult(Activity.java:2827)
03-09 11:23:25.874: ERROR/AndroidRuntime(370): at android.app.Activity.startActivity(Activity.java:2933)
03-09 11:23:25.874: ERROR/AndroidRuntime(370): at org.krish.android.caller$1.onClick(caller.java:29)
03-09 11:23:25.874: ERROR/AndroidRuntime(370): at android.view.View.performClick(View.java:2485)
03-09 11:23:25.874: ERROR/AndroidRuntime(370): at android.view.View$PerformClick.run(View.java:9080)
03-09 11:23:25.874: ERROR/AndroidRuntime(370): at android.os.Handler.handleCallback(Handler.java:587)
03-09 11:23:25.874: ERROR/AndroidRuntime(370): at android.os.Handler.dispatchMessage(Handler.java:92)
03-09 11:23:25.874: ERROR/AndroidRuntime(370): at android.os.Looper.loop(Looper.java:123)
03-09 11:23:25.874: ERROR/AndroidRuntime(370): at android.app.ActivityThread.main(ActivityThread.java:3683)
03-09 11:23:25.874: ERROR/AndroidRuntime(370): at java.lang.reflect.Method.invokeNative(Native Method)
03-09 11:23:25.874: ERROR/AndroidRuntime(370): at java.lang.reflect.Method.invoke(Method.java:507)
03-09 11:23:25.874: ERROR/AndroidRuntime(370): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
03-09 11:23:25.874: ERROR/AndroidRuntime(370): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
03-09 11:23:25.874: ERROR/AndroidRuntime(370): at dalvik.system.NativeStart.main(Native Method)`enter code here`
Ответы
Ответ 1
Убедитесь, что вы добавили тег <uses-permission ... />
на правильный уровень в файле AndroidManifest.xml
(вне тега <application ... />
, но в теге <manifest ... />
):
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.dbm.pkg"
android:versionCode="1"
android:versionName="1.0">
<!-- NOTE! Your uses-permission must be outside the "application" tag
but within the "manifest" tag. -->
<uses-permission android:name="android.permission.CALL_PHONE" />
<application
android:icon="@drawable/icon"
android:label="@string/app_name">
<!-- Insert your other stuff here -->
</application>
<uses-sdk android:minSdkVersion="9" />
</manifest>
Ответ 2
Существует два способа вызова/начала вызова: ACTION_CALL и ACTION_DIAL.
ACTION_DIAL откроет только номер дозвона с заполненным номером, но позволяет пользователю фактически вызывать или отклонять вызов. ACTION_CALL немедленно вызовет номер и потребует дополнительного разрешения.
Поэтому убедитесь, что у вас есть разрешение
uses-permission android:name="android.permission.CALL_PHONE"
в вашем AndroidManifest.xml
Ответ 3
Проблема заключается в том, что вы не запрашивали разрешения у пользователя. Если на устройстве работает Android 6.0 (уровень API 23), а приложение targetSdkVersion равно 23 или выше, разрешение на вызов будет считаться опасным. Поэтому сначала вы должны получить правильное разрешение.
Прежде всего, добавьте
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.app.myapp" >
<uses-permission android:name="android.permission.CALL_PHONE" />
...
</manifest>
в ваш файл AndroidManifest.xml.
Затем, я вызываю метод, нажимая кнопку.
public void onCall(View view) {
Intent callIntent = new Intent(Intent.ACTION_CALL); //use ACTION_CALL class
callIntent.setData(Uri.parse("tel:0800000000")); //this is the phone number calling
//check permission
//If the device is running Android 6.0 (API level 23) and the app targetSdkVersion is 23 or higher,
//the system asks the user to grant approval.
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
//request permission from user if the app hasn't got the required permission
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.CALL_PHONE}, //request specific permission from user
10);
return;
}else { //have got permission
try{
startActivity(callIntent); //call activity and make phone call
}
catch (android.content.ActivityNotFoundException ex){
Toast.makeText(getApplicationContext(),"yourActivity is not founded",Toast.LENGTH_SHORT).show();
}
}
}
Ответ 4
Возможно, вы захотите попробовать следующий подход:
Intent callIntent = new Intent(Intent.ACTION_CALL);
callIntent.setData(Uri.parse("tel:"+txtPhn.getText().toString()));
callIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(callIntent);
т.е. добавление вызова функции callIntent.setFlags(...)
.
Ответ 5
API 24
Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:+94720999666"));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
if (ActivityCompat.checkSelfPermission(this, 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.
return;
}
startActivity(intent);
а также добавьте
<uses-permission android:name="android.permission.CALL_PHONE" />
Ответ 6
Попробуйте добавить trim():
callIntent.setData(Uri.parse("tel:"+txtPhn.getText().toString().trim()));
Ответ 7
Вероятно, вам нужно протестировать его на реальном устройстве. Я столкнулся с той же проблемой, и он работал на реальном устройстве. Вызов и GPS оба иногда работают не так, как ожидалось в AVD.