有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java ANDROID:如何接收特定应用程序通知的广播?

我正在创建一个应用程序,它执行从特定应用程序(如whats app、viber等)接收广播通知的特定任务。我对此进行了搜索,但没有找到任何解决方案。是否存在执行此操作的可能性?如果存在,请指导我如何使用?:)


共 (4) 个答案

  1. # 1 楼答案

    您可以查看状态栏通知,但无法读取它们。如果可能的话,这对脆弱性来说真的很危险

    但是使用Accessibility Service,您只能侦听通知栏上的所有通知。

  2. # 2 楼答案

    尝试此操作以访问任何应用程序的通知表单

        import android.accessibilityservice.AccessibilityService;
        import android.accessibilityservice.AccessibilityServiceInfo;
        import android.app.Notification;
        import android.media.AudioManager;
        import android.os.Parcelable;
        import android.util.Log;
        import android.view.accessibility.AccessibilityEvent;
        import com.qna.vbage.Pref;
        import static com.qna.vbage.FieldVerification.setRingerMode;
    
    
        public class NotificationService extends AccessibilityService {
    
    
            protected void onServiceConnected() {
                AccessibilityServiceInfo info = new AccessibilityServiceInfo();
                info.eventTypes = AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED;
                info.feedbackType = AccessibilityServiceInfo.FEEDBACK_ALL_MASK;
                info.notificationTimeout = 3000;
                setServiceInfo(info);
            }
    
            @Override
            public void onAccessibilityEvent(AccessibilityEvent e) {
                //Toast.makeText(this, "onAccessibilityEvent", Toast.LENGTH_SHORT).show();
                Log.d("VBage", "FML");
                if (e.getEventType() == AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED) {
                   // Toast.makeText(this, "onAccessibilityEvent 2", Toast.LENGTH_SHORT).show();
                    Log.d("VBage", "Recieved event");
                    Parcelable data = e.getParcelableData();
                    if (data instanceof Notification) {
                       // Toast.makeText(this, "onAccessibilityEvent 3", Toast.LENGTH_SHORT).show();
                        Log.d("VBage", "Recieved notification");
                        Notification notification = (Notification) data;
                        Log.d("VBage", "ticker: " + notification.tickerText);
                        Log.d("VBage", "icon: " + notification.icon);
                        Log.d("VBage", "notification: " + e.getText());     
                    }
                }
            }
    
            @Override
            public void onInterrupt() {
                setRingerMode(NotificationService_API18.this, AudioManager.RINGER_MODE_SILENT);
            }
        }
    

    在清单中设置权限

    <uses-permission
        android:name="android.permission.BIND_ACCESSIBILITY_SERVICE"
        tools:ignore="ProtectedPermissions" />
    

    将清单中的服务设置为在应用程序启动时调用

       <service android:name=".NotificationService"
                android:label="@string/app_name"
                android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE" >
                <intent-filter>
                    <action android:name="android.accessibilityservice.AccessibilityService" />
                </intent-filter>
    
                <meta-data
                    android:name="android.accessibilityservice"
                    android:resource="@xml/accessibilityservice" />
            </service>
    

    在您的值文件夹中创建xmlres/Values/xml/accessibilityservice。xml

    <?xml version="1.0" encoding="utf-8"?>
    <accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
        android:accessibilityEventTypes="typeNotificationStateChanged"
        android:accessibilityFeedbackType="feedbackSpoken"
        android:notificationTimeout="100" />
    

    您必须手动启用应用程序的可访问性,并将代码放在您要开始使用此服务的活动中

    if (!isAccessibilitySettingsOn(getApplicationContext())) {
                AlertDialog.Builder dialog = new AlertDialog.Builder(mActivity);
                dialog.setNegativeButton("Go!", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                       startActivity(new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS));
                    }
                });
                showCusDialog(dialog, "Warning!", R.drawable.ic_warning, getString(R.string.accessiblityString));
    
            }
    

    从活动开始服务

    startService(new Intent(mActivity, NotificationService_API18.class));
    
  3. # 3 楼答案

    Simple只需遵循此代码并阅读此link中的文档

    清单文件

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

    在Java callbroadcastreceiver文件中

    公共类callbroadcastreceiver扩展了BroadcastReceiver
    {

    @Override
    public void onReceive(Context context, Intent intent) {
    
        String state = intent.getStringExtra( TelephonyManager.EXTRA_STATE);
    
        if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) {
            //Phone is ringing
        }
        else if (state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)) {
            //Call received
            Toast.makeText( context,"call received",Toast.LENGTH_SHORT ).show();
            context.startService( new Intent( context,BoundService.class ) );
        }
        else if (state.equals( TelephonyManager.EXTRA_STATE_IDLE)) {
            //Call Dropped or rejected
            context.stopService(  new Intent( context,BoundService.class ) );
        }
    }
    

    }

  4. # 4 楼答案

    您可以为此创建一个NotificationListenerService。不过,用户可能对授予应用程序监视其通知的权限不感兴趣,这就是为什么用户必须为应用程序手动启用此功能的原因

    但是你不能阅读内容