关于推送,反复看了几遍还是迷迷糊糊。

关于推送,反复看了几遍还是迷迷糊糊。

http://img1.sycdn.imooc.com//climg/5d8cabd0095c575213260432.jpghttp://img1.sycdn.imooc.com//climg/5d8cabdd09d4585515330150.jpg

http://img1.sycdn.imooc.com//climg/5d8cac2d097f5dd905340861.jpg

manifest

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.jpush" >


    <!-- Required -->
    <permission
        android:name="${applicationId}.permission.JPUSH_MESSAGE"
        android:protectionLevel="signature" />

    <!-- Required  一些系统要求的权限,如访问网络等-->
    <uses-permission android:name="${applicationId}.permission.JPUSH_MESSAGE" />
    <uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission-sdk-23 android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />



    <!-- Optional for location -->
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <!-- 用于开启 debug 版本的应用在6.0 系统上 层叠窗口权限 -->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" /><!-- Android Q后台定位权限-->
    <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    <uses-permission android:name="android.permission.GET_TASKS" />

    <application
        android:icon="@mipmap/ic_launcher"
        android:allowBackup="false"
        android:label="@string/app_name"
        android:theme="@style/AppTheme"
        android:name=".MyApplication">

        <!-- For test only 测试的主程序-->
        <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>


        <!-- Rich push 核心功能 since 2.0.6-->
        <activity
            android:name="cn.jpush.android.ui.PopWinActivity"
            android:theme="@style/MyDialogStyle"
            android:exported="false">
        </activity>

        <!-- Required SDK核心功能-->
        <activity
            android:name="cn.jpush.android.ui.PushActivity"
            android:configChanges="orientation|keyboardHidden"
            android:theme="@android:style/Theme.NoTitleBar"
            android:exported="false">
            <intent-filter>
                <action android:name="cn.jpush.android.ui.PushActivity" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="${applicationId}" />
            </intent-filter>
        </activity>

        <!-- Required SDK 核心功能-->
        <!-- 可配置android:process参数将PushService放在其他进程中 -->
        <service
            android:name="cn.jpush.android.service.PushService"
            android:process=":pushcore"
            android:exported="false">
            <intent-filter>
                <action android:name="cn.jpush.android.intent.REGISTER" />
                <action android:name="cn.jpush.android.intent.REPORT" />
                <action android:name="cn.jpush.android.intent.PushService" />
                <action android:name="cn.jpush.android.intent.PUSH_TIME" />
            </intent-filter>
        </service>

        <!-- since 3.0.9 Required SDK 核心功能-->
        <provider
            android:authorities="${applicationId}.DataProvider"
            android:name="cn.jpush.android.service.DataProvider"
            android:process=":pushcore"
            android:exported="false"
            />

        <!-- since 1.8.0 option 可选项。用于同一设备中不同应用的JPush服务相互拉起的功能。 -->
        <!-- 若不启用该功能可删除该组件,将不拉起其他应用也不能被其他应用拉起 -->
        <service
            android:name="cn.jpush.android.service.DaemonService"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="cn.jpush.android.intent.DaemonService" />
                <category android:name="${applicationId}" />
            </intent-filter>

        </service>

        <!-- since 3.1.0 Required SDK 核心功能-->
        <provider
            android:authorities="${applicationId}.DownloadProvider"
            android:name="cn.jpush.android.service.DownloadProvider"
            android:exported="true"
            />

        <!-- Required SDK核心功能-->
        <receiver
            android:name="cn.jpush.android.service.PushReceiver"
            android:enabled="true"
            android:exported="false">
            <intent-filter android:priority="1000">
                <action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED_PROXY" />   <!--Required  显示通知栏 -->
                <category android:name="${applicationId}" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.USER_PRESENT" />
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
            </intent-filter>
            <!-- Optional -->
            <intent-filter>
                <action android:name="android.intent.action.PACKAGE_ADDED" />
                <action android:name="android.intent.action.PACKAGE_REMOVED" />

                <data android:scheme="package" />
            </intent-filter>
        </receiver>

        <!-- Required SDK核心功能-->
        <receiver android:name="cn.jpush.android.service.AlarmReceiver" android:exported="false"/>


        <!-- User defined.  For test only  用户自定义的广播接收器-->
        <receiver
            android:name=".MyReceiver"
            android:exported="false"
            android:enabled="true">
            <intent-filter>
                <action android:name="cn.jpush.android.intent.REGISTRATION" /> <!--Required  用户注册SDK的intent-->
                <action android:name="cn.jpush.android.intent.MESSAGE_RECEIVED" /> <!--Required  用户接收SDK消息的intent-->
                <action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED" /> <!--Required  用户接收SDK通知栏信息的intent-->
                <action android:name="cn.jpush.android.intent.NOTIFICATION_OPENED" /> <!--Required  用户打开自定义通知栏的intent-->
                <action android:name="cn.jpush.android.intent.CONNECTION" /><!-- 接收网络变化 连接/断开 since 1.6.3 -->
                <category android:name="${applicationId}" />
            </intent-filter>
        </receiver>



        <!-- User defined.  For test only  用户自定义接收消息器,3.0.7开始支持,目前新tag/alias接口设置结果会在该广播接收器对应的方法中回调-->
        <!--since 3.3.0 接收JPush相关事件-->
        <receiver android:name=".jpush320.MyjPushMessageReceiver">
            <intent-filter>
                <action android:name="cn.jpush.android.intent.RECEIVE_MESSAGE" />
                <category android:name="${applicationId}"></category>
            </intent-filter>
        </receiver>

        <!--since 3.3.0 Required SDK核心功能-->
        <activity
            android:name="cn.jpush.android.service.JNotifyActivity"
            android:exported="true"
            android:taskAffinity="jpush.custom"
            android:theme="@android:style/Theme.Translucent.NoTitleBar">
            <intent-filter>
                <action android:name="cn.jpush.android.intent.JNotifyActivity" />
                <category android:name="${applicationId}" />
            </intent-filter>
        </activity>

        <!-- since 3.3.0 Required SDK 核心功能-->
        <!-- 可配置android:process参数将PushService放在其他进程中 -->
        <!--User defined.  For test only 继承自cn.jpush.android.service.JCommonService-->
        <service android:name=".jpush320.MyJCommonService"
            android:process=":pushcore">
            <intent-filter>
                <action android:name="cn.jiguang.user.service.action" />
            </intent-filter>
        </service>

        <!-- Required  . Enable it you can get statistics data with channel -->
        <meta-data android:name="JPUSH_CHANNEL" android:value="${JPUSH_CHANNEL}"/>
        <meta-data android:name="JPUSH_APPKEY" android:value="${JPUSH_APPKEY}" /> <!--  </>值来自开发者平台取得的AppKey-->

    </application>

</manifest>

MyApplcation.java

import cn.jpush.android.api.JPushInterface;

public class MyApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();

        JPushInterface.setDebugMode(true);
        JPushInterface.init(this);
    }
}

MyReceiver.java

public class MyReceiver extends BroadcastReceiver {
   private static final String TAG = "JIGUANG-Example";

   @Override
   public void onReceive(Context context, Intent intent) {
      try {
         Bundle bundle = intent.getExtras();
         Log.e(TAG, "[MyReceiver] onReceive - " + intent.getAction() + ", extras: " + printBundle(bundle));

         if (JPushInterface.ACTION_REGISTRATION_ID.equals(intent.getAction())) {
            String regId = bundle.getString(JPushInterface.EXTRA_REGISTRATION_ID);
            Log.e(TAG, "[MyReceiver] 接收Registration Id : " + regId);
            //send the Registration Id to your server...

         } else if (JPushInterface.ACTION_MESSAGE_RECEIVED.equals(intent.getAction())) {
            Log.e(TAG, "[MyReceiver] 接收到推送下来的自定义消息: " + bundle.getString(JPushInterface.EXTRA_MESSAGE));

            Toast.makeText(context, bundle.getString(JPushInterface.EXTRA_MESSAGE), Toast.LENGTH_SHORT).show();

         } else if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(intent.getAction())) {
            Log.e(TAG, "[MyReceiver] 接收到推送下来的通知");
            int notifactionId = bundle.getInt(JPushInterface.EXTRA_NOTIFICATION_ID);
            Log.e(TAG, "[MyReceiver] 接收到推送下来的通知的ID: " + notifactionId);

         } else if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(intent.getAction())) {
            Log.e(TAG, "[MyReceiver] 用户点击打开了通知");

            String extra = bundle.getString(JPushInterface.EXTRA_EXTRA);
            JSONObject jsonObject = new JSONObject(extra);
            if ("Android".equals(jsonObject.getString("type"))) {
               Intent i = new Intent(context, MainActivity.class);
               i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
               context.startActivity(i);
            } else {
               Intent i = new Intent(context, MainActivity.class);
               i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
               context.startActivity(i);
            }

         } else if (JPushInterface.ACTION_RICHPUSH_CALLBACK.equals(intent.getAction())) {
            Log.e(TAG, "[MyReceiver] 用户收到到RICH PUSH CALLBACK: " + bundle.getString(JPushInterface.EXTRA_EXTRA));
            //在这里根据 JPushInterface.EXTRA_EXTRA 的内容处理代码,比如打开新的Activity, 打开一个网页等..

         } else if(JPushInterface.ACTION_CONNECTION_CHANGE.equals(intent.getAction())) {
            boolean connected = intent.getBooleanExtra(JPushInterface.EXTRA_CONNECTION_CHANGE, false);
            Log.e(TAG, "[MyReceiver]" + intent.getAction() +" connected state change to "+connected);
         } else {
            Log.e(TAG, "[MyReceiver] Unhandled intent - " + intent.getAction());
         }
      } catch (Exception e){

      }

   }

   // 打印所有的 intent extra 数据
   private static String printBundle(Bundle bundle) {
      StringBuilder sb = new StringBuilder();
      for (String key : bundle.keySet()) {
         if (key.equals(JPushInterface.EXTRA_NOTIFICATION_ID)) {
            sb.append("\nkey:" + key + ", value:" + bundle.getInt(key));
         }else if(key.equals(JPushInterface.EXTRA_CONNECTION_CHANGE)){
            sb.append("\nkey:" + key + ", value:" + bundle.getBoolean(key));
         } else if (key.equals(JPushInterface.EXTRA_EXTRA)) {
            if (TextUtils.isEmpty(bundle.getString(JPushInterface.EXTRA_EXTRA))) {
               Log.e(TAG, "This message has no Extra data");
               continue;
            }

            try {
               JSONObject json = new JSONObject(bundle.getString(JPushInterface.EXTRA_EXTRA));
               Iterator<String> it =  json.keys();

               while (it.hasNext()) {
                  String myKey = it.next();
                  sb.append("\nkey:" + key + ", value: [" +
                        myKey + " - " +json.optString(myKey) + "]");
               }
            } catch (JSONException e) {
               Log.e(TAG, "Get message extra JSON error!");
            }

         } else {
            sb.append("\nkey:" + key + ", value:" + bundle.get(key));
         }
      }
      return sb.toString();
   }

}

http://img1.sycdn.imooc.com//climg/5d8cacae0913511807650231.jpg

http://img1.sycdn.imooc.com//climg/5d8caca309b31f4107370170.jpghttp://img1.sycdn.imooc.com//climg/5d8cacb5091f337d06780171.jpg

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

10回答
提问者 雎山月 2019-09-27 19:29:50

MainActivity.java

public class MainActivity extends AppCompatActivity {
    private static final int MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE = 1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if (ContextCompat.checkSelfPermission(this,
                android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED) {

//            没有写入外部存储的权限

//            判断用户之前是否拒绝过我们的权限申请
            if (ActivityCompat.shouldShowRequestPermissionRationale(this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE)) {

            } else {
//                申请写入外部存储权限
                ActivityCompat.requestPermissions(this,
                        new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                        MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE);
            }

        }
    }
}


  • https://docs.jiguang.cn/jpush/client/Android/android_senior/ 中的Example - 高级自定义的 PushNotificationBuilder呢
    2019-09-29 17:42:11
提问者 雎山月 2019-09-27 19:28:24

jpush320/MyJCommonService.java

import cn.jpush.android.service.JCommonService;
public class MyJCommonService extends JCommonService {
}


jpush320/MyjPushMessageReceiver.java

import cn.jpush.android.service.JPushMessageReceiver;

public class MyjPushMessageReceiver extends JPushMessageReceiver {
}

jpush320/MyWakedResultReceiver.java

import cn.jpush.android.service.WakedResultReceiver;

public class MyWakedResultReceiver extends WakedResultReceiver {


    @Override
    public void onWake(Context context, int i) {
        super.onWake(context, i);
    }
}

MyNotification.java

public class MyNotification extends CustomPushNotificationBuilder {
    public MyNotification(Context context) {
        super(context, R.layout.my_notification, R.id.iv_icon, R.id.tv_title, R.id.tv_content);
    }
}

my_notification.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:padding="8dp">

    <ImageView
        android:id="@+id/iv_icon"
        android:layout_width="66dp"
        android:layout_height="66dp" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_marginLeft="12dp">

        <TextView
            android:id="@+id/tv_title"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="28sp"/>

        <TextView
            android:id="@+id/tv_content"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="22sp"/>

    </LinearLayout>

</LinearLayout>


提问者 雎山月 2019-09-27 19:16:33

我换了一个模拟器,还是我不得,我补全代码给老师您看一下吧。http://img1.sycdn.imooc.com//climg/5d8def7809db597532721012.jpg

提问者 雎山月 2019-09-27 18:59:32

我把图片引用都去掉了,也不得。http://img1.sycdn.imooc.com//climg/5d8deb6a0963d11129240953.jpghttp://img1.sycdn.imooc.com//climg/5d8deb6a0963d11129240953.jpg

  • 你重新清一下log,你的图中并没有显示log的报错。另外你的手机此应用允许notification了吧?如果还是不行,请将代码全部贴全,老师测试一下
    2019-09-27 19:08:02
  • 提问者 雎山月 回复 好帮手慕雪 #2
    notification应用权限给过了但是不行,老师我补全代码给您测试一下吧。
    2019-09-27 19:16:01
提问者 雎山月 2019-09-27 11:35:33
好帮手慕雪 2019-09-27 11:31:56

请注意这个图片。应该是它出的问题

http://img1.sycdn.imooc.com//climg/5d8d82760903c9b105030139.jpg

  • 提问者 雎山月 #1
    可是,我没找到这个图片呀,截图在上
    2019-09-27 11:35:21
  • 好帮手慕雪 回复 提问者 雎山月 #2
    你的notification 是怎么构建的。应该就是notification 的问题
    2019-09-27 13:48:02
  • https://community.jiguang.cn/t/android5-0-android-app-remoteserviceexception/8768 这跟官网论坛发的帖子是一样的。你把自定义的图标去掉试试
    2019-09-27 13:54:54
提问者 雎山月 2019-09-27 10:15:33

老师,还是不得

http://img1.sycdn.imooc.com//climg/5d8d70b50929ed1a32890962.jpg

好帮手慕雪 2019-09-27 10:02:08

原因是缺少你现在手机设备分辨率的Drawable资源。你把所有的图片都往drawable文件夹中复制一份放进去。注意不是drawable-XXX,就是drawable文件夹哦。祝:学习愉快

  • 提问者 雎山月 #1
    我的,我试一试
    2019-09-27 10:10:35
提问者 雎山月 2019-09-26 20:39:05

一发通知App就关闭

http://img1.sycdn.imooc.com//climg/5d8cb0b20983f09622990940.jpg


http://img1.sycdn.imooc.com//climg/5d8cb11109173d7517540267.jpg

提问者 雎山月 2019-09-26 20:25:42

麻烦老师帮我看一下这个是什么问题

  • 提问者 雎山月 #1
    模拟器推送栏没有反应
    2019-09-26 20:29:17
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
2.Android 网络操作与流行框架
  • 参与学习           人
  • 提交作业       220    份
  • 解答问题       1800    个

本阶段是联网及数据处理的必备技能。课程从网络基础知识到线程间协同工作、异步下载处理;从文件存储、到轻量级数据库SQLite的使用;最后利用最流程的第三方框架助你快速开发企业级APP。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师