着信が入った時にダイアログを表示するアプリを作っていまして、素人ながらもいろいろなサイトを参考にしながらそれなりに形にはなっているのですが、ダイアログの表示でもう1か月以上滞っていて、ヒントだけでも頂けると助かります。
着信の状態を捕捉するクラス(PhoneReceiver.class)を下の様に作っていまして、着信が入ると
Java
1 AlertDialog.Builder builder = new AlertDialog.Builder(context); 2 builder.setMessage(R.string.dialog_message) 3 .setTitle(R.string.dialog_title) 4 .setPositiveButton(R.string.dialog_button, null) 5 .setView(layout); 6 builder.show();
という形でAlertDialogを表示させようとしましたが、アプリが強制終了します。
PhoneReceiverクラスがActivityクラスじゃないということが理由なのだろうと思いつつも、具体的な解決策を出せないでいます。
androidの公式サイトを見れば、DialogFragmentを推奨されていたので、同様にPhoneReceiverクラスがActivityでもFragmentクラスでもないために表示されないものと思います。
仕方がないので、他のサイトを参考にして下のようにToastをカスタマイズして、表示時間の延長、ボタンの追加等をしたのですが、納得ができないでいます。
popupWindowも試してみたのですが、これもうまくいきませんでした。
ですので、元のとおり、AlertDialogを表示する方法、ヒント等ありましたら、教えていただきたく質問いたします。
PhoneReceiverのコードは下に記載しています。
それとも根本的にやり方を変えた方がよいのでしょうか。
※捕捉1
あるサイトでこのような解決方法を見つけたのですが、
Java
1 public void showWarningAlert(Context context) { //Added argument 2 AlertDialog alertDialog = new AlertDialog.Builder(context).create(); //Use context 3 alertDialog.setTitle("Warning"); 4 alertDialog.setMessage("You are currently in a battle"); 5 alertDialog.setButton(AlertDialog.BUTTON_NEUTRAL, "OK", 6 new DialogInterface.OnClickListener() { 7 public void onClick(DialogInterface dialog, int which) { 8 dialog.dismiss(); 9 } 10 }); 11 alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); 12 alertDialog.show(); 13 }
結局アプリは強制終了する状態です。alertDialog.show()のところでエラーが出ています。
※捕捉2
Logcatの内容です。PhoneReceiverに青文字がついています。
Java
105-11 09:13:42.101 26582-26582/com.example.ma2ri.newstage E/AndroidRuntime: FATAL EXCEPTION: main 2 Process: com.example.ma2ri.newstage, PID: 26582 3 java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity. 4 at android.support.v7.app.AppCompatDelegateImplV7.createSubDecor(AppCompatDelegateImplV7.java:343) 5 at android.support.v7.app.AppCompatDelegateImplV7.ensureSubDecor(AppCompatDelegateImplV7.java:312) 6 at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:277) 7 at android.support.v7.app.AppCompatDialog.setContentView(AppCompatDialog.java:80) 8 at android.support.v7.app.AlertController.installContent(AlertController.java:214) 9 at android.support.v7.app.AlertDialog.onCreate(AlertDialog.java:256) 10 at android.app.Dialog.dispatchOnCreate(Dialog.java:578) 11 at android.app.Dialog.show(Dialog.java:314) 12 at com.example.ma2ri.newstage.PhoneReceiver.showWarningAlert(PhoneReceiver.java:173) 13 at com.example.ma2ri.newstage.PhoneReceiver.onCallStateChanged(PhoneReceiver.java:60) 14 at android.telephony.PhoneStateListener$1.handleMessage(PhoneStateListener.java:323) 15 at android.os.Handler.dispatchMessage(Handler.java:102) 16 at android.os.Looper.loop(Looper.java:158) 17 at android.app.ActivityThread.main(ActivityThread.java:7237) 18 at java.lang.reflect.Method.invoke(Native Method) 19 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 20 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
Java
1 class PhoneReceiver extends PhoneStateListener { 2 private int totalCount = 0; 3 private Context context; 4 Intent intent; 5 TextView textView; 6 ToastCustom toastCustom; 7 View view; 8 PhoneReceiver(Context context) { 9 this.context = context; 10 } 11 12 public void onCallStateChanged(int state, String incomingNumber) { 13 super.onCallStateChanged(state, incomingNumber); 14 15 switch (state) { 16 case TelephonyManager.CALL_STATE_RINGING: 17 18 Cursor addressTable = context.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null); 19 if (addressTable != null) { 20 while (addressTable.moveToNext()) { 21 String phoneNumber = addressTable.getString(addressTable.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 22 for (int i = 0; i < addressTable.getCount(); i++) { 23 int count = BooleanSum(PhoneNumberUtils.compare(phoneNumber, incomingNumber)); 24 totalCount += count; 25 } 26 } 27 addressTable.close(); 28 } 29 if (totalCount >= 1) { 30 31 /* 32 final LayoutInflater inflater = (LayoutInflater)context.getSystemService(LAYOUT_INFLATER_SERVICE); 33 final View layout = inflater.inflate(R.layout.toast_layout, null); 34 final TextView textView = (TextView) layout.findViewById(R.id.text); 35 textView.setText(R.string.alert); 36 37 final Toast toast = new Toast(context.getApplicationContext()); 38 toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0); 39 toast.setDuration(Toast.LENGTH_LONG); 40 toast.setView(layout); 41 toast.show(); 42 */ 43 44 CustomToast.makeText(context).show(); 45 46 } 47 break; 48 49 case TelephonyManager.CALL_STATE_OFFHOOK: 50 Toast.makeText(context, R.string.off_hook + incomingNumber, Toast.LENGTH_LONG).show(); 51 break; 52 } 53 } 54 55 private int BooleanSum(Boolean exchanger) { 56 if (exchanger) return 1; 57 else { 58 return 0; 59 } 60 }
_
回答3件
あなたの回答
tips
プレビュー