Notifcation Access Denied - Android

时间:2017-08-01 14:45:21

标签: android listeners

我正在创建一个Android应用来访问通知。到目前为止,我的NotificationListenerService无法访问通知。它不在下面显示的允许应用程序通知访问列表中。我怎么能启用它?我的 Manifest.xml,MainActivity.java和MyNotificationListener.java 如下所示

的Manifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="me.shikanga.NotificationListen2" >

    <uses-permission android:name="android.permission.WRITE_EXRERNAL_STORAGE"/>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme"
        android:resizeableActivity = "true">
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

        <service
            android:name=".MyNotificationListener"
            android:label="@string/app_name"
            android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE"
            >
            <intent-filter>
                <action android:name="android.service.notification.MyNotificationListener"/>
            </intent-filter>
        </service>
    </application>

</manifest>

MyNotificationListener.java

package me.shikanga.NotificationListen2;

import android.service.notification.NotificationListenerService;
import android.content.*;
import android.os.*;
import android.widget.*;
import android.util.*;
import android.app.*;
import android.service.notification.NotificationListenerService.*;
import android.service.notification.*;
import java.io.*;
import java.util.*;
import android.graphics.*;

public class MyNotificationListener extends NotificationListenerService
{
    @Override
    public void onNotificationPosted(StatusBarNotification sbn, NotificationListenerService.RankingMap rankingMap)
    {
        // TODO: Implement this method
        super.onNotificationPosted(sbn, rankingMap);

    String pack = sbn.getPackageName();
    String ticker="";
    if(sbn.getNotification().tickerText.toString()!=null)
    {
        ticker=sbn.getNotification().tickerText.toString();
    }
    Bundle extras=sbn.getNotification().extras;
    String title=extras.getString("android.title");
    String text= extras.getCharSequence("android.text").toString();
    int id1= extras.getInt(Notification.EXTRA_SMALL_ICON);
    Bitmap id = sbn.getNotification().largeIcon;

    Toast.makeText(getApplicationContext(),pack +title+text, Toast.LENGTH_SHORT).show();
    Log.e("Posted", pack+ticker+title+text);
}

@Override
public void onNotificationRemoved(StatusBarNotification sbn)
{
    // TODO: Implement this method
    super.onNotificationRemoved(sbn);

    String pack = sbn.getPackageName();
    Log.e("Removed", pack);
}
}

MainActivity.java

package me.shikanga.NotificationListen2;

import android.app.*;
import android.os.*;
import android.widget.Button;
import android.view.View.*;
import android.view.*;
import android.content.*;
import android.widget.*;
import android.util.*;
import java.util.*;
import android.provider.*;

public class MainActivity extends Activity 
{
    Button startButton,stopButton;
    Context context;
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

    startButton=(Button) findViewById(R.id.startButton);
    stopButton=(Button) findViewById(R.id.stopButton);
    context=getApplicationContext();

    if(!checkNotificationEnabled())
    {
        Toast.makeText(context, "Notification access denied", Toast.LENGTH_SHORT).show();
        Log.e(getPackageName(), "Notification Access denied");
    }
    else
    {
        Toast.makeText(context, "Notification access enabled", Toast.LENGTH_SHORT).show();
        Log.e(getPackageName(), "Notification Access Enabled");

        //go to settimgs to enable notification access
        //startActivity(new Intent(Settings.ACTION_SECURITY_SETTINGS));
    }

    startButton.setOnClickListener(new OnClickListener()
    {
        public void onClick(View v)
        {
            try
            {
                Intent i = new Intent(getApplicationContext(), MyNotificationListener.class);
                startService(i);

                Date date= new Date();
                Log.e(getPackageName()+" "+date.toString(),"MyNotificationListener service intent called sucessfully");
                //Toast.makeText(getApplicationContext(), date.toString()+"Intent called successfully", Toast.LENGTH_SHORT).show();
            }
            catch(Exception e)
            {
                //Toast.makeText(getApplicationContext(), "Failed to call intent", Toast.LENGTH_SHORT).show();
                Date date = new Date();
                Log.e(getPackageName()+" "+date.toString(),"Failed to start MyNotificationListener Service");
            }
        }
    });

    stopButton.setOnClickListener(new OnClickListener()
        {
            public void onClick(View v)
            {
                try
                {
                    Intent i = new Intent(getApplicationContext(), MyNotificationListener.class);
                    stopService(i);
                    Date date = new Date();
                    Log.e(getPackageName()+" "+date.toString(),"MyNotificationListener service stop intent called sucessfully");
                    //Toast.makeText(getApplicationContext(), "Intent called successfully", Toast.LENGTH_SHORT).show();
                }
                catch(Exception e)
                {
                    //Toast.makeText(getApplicationContext(), "Failed to call intent", Toast.LENGTH_SHORT).show();
                    Date date = new Date();
                    Log.e(getPackageName()+" "+date.toString(),"Failed to start MyNotificationListener Service");
                }
            }
        });
}


//Check of notification acccess is enabled
public boolean checkNotificationEnabled()
{
    String enabledListeners = Settings.Secure.getString(context.getContentResolver(), "enabled_notification_listeners");
    String packageName= getPackageName();
    if (enabledListeners.contains(packageName))
    {
        return true;
    }
    else
        {
            return false;
        }
}
}

我应该在哪里修改?谢谢。 jerryshikanga@gmail.com

1 个答案:

答案 0 :(得分:0)

据我所知,您无法以编程方式启用通知。在每台设备中,您都必须打开设备设置,并允许访问任何想要阅读通知的应用程序。