手记

Notification适配8.0

今天突然测试说app不能升级了,我看了看原来是我升级androidstuido,默认版本升级了,
索性就做个适配把,其实问题就俩个第一个是声音在NotificationChannel 中设置,不是在原来的
Notification中设置了,还有一个问题是在创建Notification前先把NotificationChannel创建出
来,还有一个问题是,升级app需要多添加一个权限,允许外来安装权限,好了就这么多。
 
public static final String ACTION_START = "ACTION_START";
    private String mApkPath;
    private String mApkName;
    private boolean mCanceled = false;
    private NotificationManager mManager;

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @RequiresApi(api = Build.VERSION_CODES.O)
    @Override
    public void onCreate() {
        super.onCreate();
        if (Environment.getExternalStorageState().equals(
                Environment.MEDIA_MOUNTED)) {
            mApkPath = Environment.getExternalStorageDirectory().getAbsolutePath();
            mApkName = "otouzi.apk";
            initNotificationChannel(this);
            setUpNotifiction();
            registerBroader();
        } else {
            ToastUtils.getInstance(UpdateService2.this, "SD卡不存在",
                    Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        if (ACTION_START.equals(intent.getAction())) {// 下载跟新
            NewVersion newVersion = (NewVersion) intent
                    .getSerializableExtra("Version");
            // newVersion.url = "http://www.imooc.com/mobile/imooc.apk";// 测试
            new Thread(new UpdateService2.DownApkRunnable(newVersion.url)).start();
        }
        return super.onStartCommand(intent, flags, startId);
    }

    /**
     * 创建通知
     * mNotification.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION));
     *  mNotification.setSound(Settings.System.DEFAULT_NOTIFICATION_URI);
     *  mNotification.setDefaults(Notification.DEFAULT_SOUND);
     *  Uri uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
     *  Uri customSoundUri = Uri.parse(“android.resource://”+ getPackageName()+“/”+ R.raw.twirl)
     */
    Notification.Builder mNotification;
    RemoteViews contentView;
    @RequiresApi(api = Build.VERSION_CODES.O)
    private void setUpNotifiction() {
        mManager = (NotificationManager) getSystemService(Service.NOTIFICATION_SERVICE);
        mNotification = new Notification.Builder(UpdateService2.this, "1");
        mNotification.setSmallIcon(android.R.drawable.stat_notify_chat)
                .setContentText("屹农金服")
                .setNumber(3)
                .setPriority(Notification.PRIORITY_MAX)
                .setContentTitle("屹农金服");
//        Uri customSoundUri=Uri.parse("android.resource://" + getApplicationContext().getPackageName() + "/" +R.raw.twirl);
//        mNotification.setSound(customSoundUri);//defaultSoundUri
        contentView = new RemoteViews(getPackageName(),
                R.layout.activity_notify_update);
        contentView.setTextViewText(R.id.name, "正在下载中");

        Intent canceledIntent = new Intent("canceled");
        canceledIntent.putExtra("canceled", "canceled");
        PendingIntent canceledPendingIntent = PendingIntent.getBroadcast(
                UpdateService2.this, 1, canceledIntent,
                PendingIntent.FLAG_UPDATE_CURRENT);
        contentView.setOnClickPendingIntent(R.id.cancle, canceledPendingIntent);
        mNotification.setCustomContentView(contentView);

        Intent intent = new Intent(UpdateService2.this, MainActivity.class);
        PendingIntent contentIntent = PendingIntent.getActivity(
                UpdateService2.this, 0, intent,
                PendingIntent.FLAG_UPDATE_CURRENT);
        mNotification.setContentIntent(contentIntent);

        mManager.notify(0, mNotification.build());// 发送通知
    }

    /**
     * 取消接收者
     *
     *
     */
    class CanceledReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            if ("canceled".equals(intent.getStringExtra("canceled"))) {
                mCanceled = true;
                mManager.cancel(0);
                stopSelf();
            }
        }

    }

    /**
     * 注册广播
     */
    public void registerBroader() {
        IntentFilter filter = new IntentFilter();
        filter.addAction("canceled");
        registerReceiver(new UpdateService2.CanceledReceiver(), filter);
    }

    /**
     * 下载apk
     *
     *
     */
    class DownApkRunnable implements Runnable {
        private String mApkUrl;

        public DownApkRunnable(String mApkUrl) {
            super();
            this.mApkUrl = mApkUrl;
        }

        @Override
        public void run() {
            downloadApk(mApkUrl);
        }

    }

    private int laterate = 0;

    /**
     * 下载apk
     *
     * @param apkurl
     */
    private void downloadApk(String apkurl) {
        try {
            URL url = new URL(apkurl);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            int length = conn.getContentLength();
            int count = 0;
            File apkPathFile = new File(mApkPath);
            if (!apkPathFile.exists()) {
                apkPathFile.mkdir();
            }
            File apkFile = new File(mApkPath, mApkName);
            InputStream in = conn.getInputStream();
            FileOutputStream os = new FileOutputStream(apkFile);
            byte[] buffer = new byte[1024];
            do {
                int numread = in.read(buffer);
                count += numread;
                int progress = (int) (((float) count / length) * 100);// 得到当前进度
                if (progress >= laterate + 1) {// 只有当前进度比上一次进度大于等于1,才可以更新进度
                    laterate = progress;
                    Message msg = new Message();
                    msg.what = 1;
                    msg.arg1 = progress;
                    handler.sendMessage(msg);
                }
                if (numread <= 0) {// 下载完毕
                    handler.sendEmptyMessage(2);
                    mCanceled = true;
                    break;
                }
                os.write(buffer, 0, numread);
            } while (!mCanceled);// 如果没有被取消
            in.close();
            os.close();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.toString();
            e.printStackTrace();
        }

    }

    Handler handler = new Handler() {
        public void handleMessage(android.os.Message msg) {
            switch (msg.what) {
                case 1:// 更新进度
                    int progress = msg.arg1;
                    if (progress < 100) {
                        contentView.setTextViewText(R.id.tv_progress, progress
                                + "%");
                        contentView.setProgressBar(R.id.progressbar, 100, progress,
                                false);
                    } else {// 下载完成,停止服务
                        stopSelf();
                    }
                    mManager.notify(0, mNotification.build());
                    break;
                case 2:// 安装apk
                    mManager.cancel(0);
                    installApk();
                    break;

                default:
                    break;
            }
        }
    };

    /**
     * 安装apk
     */
    private void installApk() {
        File apkFile = new File(mApkPath,mApkName);
//    File apkFile = new File("/storage/emulated/0/otouzi.apk");
        if (!apkFile.exists()) {
            return;
        }
        Intent intent = new Intent(Intent.ACTION_VIEW);
        //判断是否是AndroidN以及更高的版本
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            Uri contentUri = FileProvider.getUriForFile(getApplicationContext(), "com.otouzi.finance.fileprovider", apkFile);
            Logger.d("contentUri: " + contentUri);
            intent.setDataAndType(contentUri, "application/vnd.android.package-archive");
        } else {
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive");
        }
        startActivity(intent);
    }
    /**
     * 初始化信息适配8.0
     * @param context
     */
    @RequiresApi(api = Build.VERSION_CODES.O)
    public  void initNotificationChannel(Context context) {
        NotificationManager  mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        NotificationChannel channel2 = new NotificationChannel("1",
                "Channel2", NotificationManager.IMPORTANCE_DEFAULT);
//        Uri customSoundUri=Uri.parse("android.resource://" + getApplicationContext().getPackageName() + "/" +R.raw.twirl);
        channel2.setSound(null,null);
        channel2.enableLights(true);
        channel2.setLightColor(Color.GREEN);
        mNotificationManager.createNotificationChannel(channel2);
    }
}

原文链接:http://www.apkbus.com/blog-340477-76981.html

0人推荐
随时随地看视频
慕课网APP

热门评论

楼主,我用:

soundUri = Uri.parse("android.resource://"
builder.setSound(soundUri)

方式播放语音,android8.0之下的是可以的,8.0的不行。

知道原因吗?

查看全部评论