Android:状态栏禁用时蓝牙多文件传输弹窗及进度显示

时间:2022-09-03 16:56:46

一、蓝牙文件传输弹窗

  Android原生蓝牙传输文件时,会弹出蓝牙文件接收的确认框且默认是以notification的形式显示在状态栏,当用户点击之后才会弹出一个dialog。那么当状态栏被禁用时,如何实现文件接受全程不需用户点击而自动接收呢?

1.如何不让用户点击状态栏直接弹确认的dialog?

 在BluetoothOppNotification.java的updateIncomingFileConfirmNotification()方法中会对接受到来的文件进行一定的处理同时会构造一个Notification,来显示接受和拒绝的信息,那么解决的思路就在这里。

 private void updateIncomingFileConfirmNotification() {

 //省略若干… 

 Intent intent = new Intent(Constants.ACTION_INCOMING_FILE_CONFIRM);//这句比较关键,传递一个action到BluetoothOppReceiver

 intent.setClassName(Constants.THIS_PACKAGE_NAME, BluetoothOppReceiver.class.getName());

 intent.setDataAndNormalize(contentUri);

 intent构造了之后在这里并没有发送广播出去,而是在下面构造notification之后,点击时才将广播发送出去,所以问题的解决点就在这里。如果不需要用户点击状态栏直接显示文件接收和拒绝的确认界面可以直接在这里mContext.sendBroadcast(intent);将广播发送出去

//省略若干…

{

//构造notification

 Notification n = new Notification();

 n.icon = R.drawable.bt_incomming_file_notification;

 n.flags |= Notification.FLAG_ONLY_ALERT_ONCE;

 n.flags |= Notification.FLAG_ONGOING_EVENT;

 n.defaults = Notification.DEFAULT_SOUND;

 n.tickerText = title;

 n.when = timeStamp;

 n.color = mContext.getResources().getColor(

 com.android.internal.R.color.system_notification_accent_color);

 n.setLatestEventInfo(mContext, title, caption, PendingIntent.getBroadcast(mContext, 0,

 intent, 0));

 intent = new Intent(Constants.ACTION_HIDE);

 intent.setClassName(Constants.THIS_PACKAGE_NAME, BluetoothOppReceiver.class.getName());

 intent.setDataAndNormalize(contentUri);

 n.deleteIntent = PendingIntent.getBroadcast(mContext, 0, intent, 0);//用户点击之后将广播发送出去

 mNotificationMgr.notify(id, n);

 }

 }

}

2.用户不点击确认文件接收的按钮如何直接进行文件接收?

 继续上面说的,当广播发送之后在BluetoothOppReceiver.java直接启动BluetoothOppIncomingFileConfirmActivity。在这个activity中作进一步的处理。

 可以看到的是在这个activity中主要是构造上面所说的接收文件确认和拒绝的dialog。

 要想达到需要的效果,只需要将确认接收按钮事件的代码外移即可。可以直接移动的oncreate中执行,完了之后将dialog dismiss掉。主要就是如下几句代码

if (!mTimeout) {

 // Update database

 mUpdateValues = new ContentValues();

 mUpdateValues.put(BluetoothShare.USER_CONFIRMATION,

 BluetoothShare.USER_CONFIRMATION_CONFIRMED);

 this.getContentResolver().update(mUri, mUpdateValues, null, null);

 Toast.makeText(this, getString(R.string.bt_toast_1), Toast.LENGTH_SHORT).show();

 }

3.如何显示进度条?

 当上面的文件开始接受之时就需要弹出进度条进行显示进度,所以在上面的代码中还需要加入启动进度条界面的代码:

 Intent in = new Intent(this, BluetoothOppTransferActivity.class);

 in.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

 in.setDataAndNormalize(mUri);

 this.startActivity(in);

 至此,单文件就开始传输并且已经显示进度条。

4.文件传输完成后,进度条界面如何三秒之后自动消失?

 进入BluetoothOppTransferActivity这个activity,首先先定义一个消失的方法:

private void dismissNowDialog(){

 new Handler().postDelayed(new Runnable() {

 @Override

 public void run() {

 dismiss();

 }

 }, 2000);

 }

 之后再setUpDialog()中mWhichDialog == DIALOG_RECEIVE_COMPLETE_SUCCESS和mWhichDialog == DIALOG_RECEIVE_COMPLETE_FAIL时调用这个方法即可。

 写到这里,单文件文件传输全程不需要用户进行任何点击就可以自动接收完成。

 但是不知道您有没有想过一个问题,在接受完之后dismiss掉了界面,那么在多文件传输时后面的那些文件进度条是否还会显示呢?答案是不会的。

5.多文件时如何显示所有文件传输的进度条?

  思路就是,再多文件传输时,单个文件传输完,状态栏会进行更新显示其他文件的进度信息,考虑到这里,继续进入BluetoothOppNotification.java这个类,在updateActiveNotification()方法中可以看到多文件在传输时,它是通过Notification.Builder来进行刷新显示的,我们的需求并不是这样,所以这些并不可取。继续往下看可以看到重点是Intent intent = new Intent(Constants.ACTION_LIST);这个可以理解为处理多文件的。原生的代码并没有很好地办法来区分多文件还是单文件,所以需要在这里想办法进行处理。笔者在做的时候看到这个很是兴奋,一想这不很简单吗,和单文件传输如出一辙我只需要将广播手动发送一遍即可。结果会让你崩溃的,这里简单说下,假如十个文件在传输时那么这个广播他会发几遍呢?最终的结果就是后面的界面不停的闪烁加重叠。所以这里要做的就是在文件传输时只将这个广播发送一次,但是并没有现成的方法或变量来标示是否多文件传输。

  笔者这里采用的思路是定义一个任意类型的变量,给定一个初始值,找一个在文件接收时肯定会调用的一个方法,在这个方法中改变该变量的值,再在发送广播时加上对这个变量的判断,全部传输完后将该变量恢复默认值,以此保证广播只发送了一次,即可达到需求。

Private Int temp =0;

 private void updateActiveNotification() {

 ……

   if(temp==1){//通过这个判断保证广播只会发送一次
    mContext.sendBroadcast(intent);
    temp=temp+1;
  } …… } rivate void updateIncomingFileConfirmNotification() { //这个方法中加入如下代码   if(temp==1){
    temp=temp+1;
    return;
  }
……   temp=1; }

 至此,整个需求处理完毕。当让如果在接受完毕之后还想显示多少文件传输完成,多少文件传输失败的话可以通过在代码中BluetoothOppTransferActivity.java中动态的改变dialog的显示信息来进行处理,需要注意的是在这个类里面是不知道有多少文件传输完成和失败的,需要从BluetoothOppNotification.java 的updateCompletedNotification()方法中,将

int outboundSuccNumber = 0;

 int outboundFailNumber = 0;

 int outboundNum;

 int inboundNum;

 int inboundSuccNumber = 0;

 int inboundFailNumber = 0;

 参数选择性的进行传输或者保存,从而在上面说的界面显示出来。

 最后再来一个小知识点:不知有没有想过,蓝牙文件在传输时如何判断文件是正在传输还是已经传输完毕呢?原生的蓝牙代码之后提供蓝牙的配对,连接等状态,并不会提供文件传输的状态,那么就需要自己来实现。思路就是蓝牙文件的传输是通过流来进行的,那么我只需要知道它所对应的刘是否关闭即可知道文件是否传输完成。

 在framework\base\obex\javax\obex下面有个ServerSession类,在这个里面会通过判断ObexTransport; InputStream OutputStream来判断是否关闭,可以自己在这里加接口提供给外部,用来判断蓝牙文件是否传输完成,比较简单。

Android:状态栏禁用时蓝牙多文件传输弹窗及进度显示的更多相关文章

  1. Android SDK 更新时修改hosts文件仍然无法更新,可试试这个方法……

    Android SDK 更新时修改hosts文件仍然无法更新,此时必定万分蛋疼.在hosts文件中更换了各种ip,仍然解决不了!!!!!!!!!!!!!!? 第一步: 打开此软件,等待服务器连接 第二 ...

  2. Android SDK生成时,自定义文件名称,而非系统第一分配的app-release.apk

    buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.tx ...

  3. android -- 蓝牙 bluetooth (四)OPP文件传输

    在前面android -- 蓝牙 bluetooth (一) 入门文章结尾中提到了会按四个方面来写这系列的文章,前面已写了蓝牙打开和蓝牙搜索,这次一起来看下蓝牙文件分享的流程,也就是蓝牙应用opp目录 ...

  4. ZT android -- 蓝牙 bluetooth (四)OPP文件传输

    android -- 蓝牙 bluetooth (四)OPP文件传输 分类: Android的原生应用分析 2013-06-22 21:51 2599人阅读 评论(19) 收藏 举报 4.2源码AND ...

  5. 基于WCF的支持跨局域网可断点续传的大文件传输服务实现

    题外话:这个系列的文章记录了本人最近写的一个小工程,主要包含了两个功能,一是对文件的断点续传的功能,二是基于WCF的一对多文件主动发送的功能,顺便这也是我自己在WCF学习路上的一个小成果吧. 在网上找 ...

  6. 使用 IntelliJ IDEA 开发 Android 应用程序时配置 Allatori 进行代码混淆

    IntelliJ IDEA 提供了非常强大的 Android 开发支持,就连 Google 官方推荐的 Android Studio 其实也是 IntelliJ IDEA 的一个 Android 开发 ...

  7. Android关闭USB的ADB调试和文件传输功能(禁用USB)【转】

    本文转载自:https://blog.csdn.net/jun4331247/article/details/51201825 通过设置系统属性(System Property)[persist.sy ...

  8. android asmack 注册 登陆 聊天 多人聊天室 文件传输

    XMPP协议简介 XMPP协议(Extensible Messaging and PresenceProtocol,可扩展消息处理现场协议)是一种基于XML的协议,目的是为了解决及时通信标准而提出来的 ...

  9. Android连接热点的Socket文件传输

    最近把测试丢过来的种种BUG解决后,终于有时间去研究研究Socket通信,再加上以前做的WiFi连接和热点开启,于是有了现在的这篇博文:创建热点发送文件,让另一台手机连接热点接收文件. 效果图: 两台 ...

随机推荐

  1. .net(C#)访问Oracle数据库的几种免安装组件的对比

    Oracle 数据存取组件(ODAC) 库为Borland Delphi,C++ Builder 以及 Kylix提供了一些非可视化的组件.它们用来存取Oracle关系数据库系统.与BDE类似, OD ...

  2. Javascript 笔记与总结(2-17)事件委托

    [例]五子棋,单次点击为黑色,偶次点击为白色.e.target 的用法 <!DOCTYPE html> <html lang="en"> <head& ...

  3. 实现ScrollView中包含ListView,动态设置ListView的高度

    ScrollView 中包含 ListView 的问题 : ScrollView和ListView会冲突,会导致ListView显示不全 <?xml version="1.0&quot ...

  4. Spark RDD概念学习系列之RDD的创建(六)

    RDD的创建  两种方式来创建RDD: 1)由一个已经存在的Scala集合创建 2)由外部存储系统的数据集创建,包括本地文件系统,还有所有Hadoop支持的数据集,比如HDFS.Cassandra.H ...

  5. delphi ExecWB

    TWebBrowser.ExecWB 关键点 procedure ExecWB(cmdID: OLECMDID; cmdexecopt: OLECMDEXECOPT); overload; 实现过程 ...

  6. XTU1199:Number Game

    题目描写叙述 给你一个有N个数的集合S和一个数X,推断是否存在S的一个子集,子集里的数的最小公倍数正好是X. 输入 第一行是数据组数T. 接下来有多组数据,每组数据包括两行: 第一行有2个数N和X,1 ...

  7. cad 画 tp图

    本文记录了cad 绘制 结构图 和触摸屏激光图. 1作为一个新手,我先要做的是适应操作界面. 页面:ctrl+鼠标滚轮 (类比,ps,ad等软件都是这样的.) 选取,划线,图层.等... 2画图... ...

  8. 2014第2周三Web安全学习

    2014第2周三Web安全学习 先记录下自己关于json和xml作为数据传递媒介的差异:在写一个java方法时我将正确结果返回的对象转成json返回,将错误结果根据不同原因以xml形式返回,同事看后有 ...

  9. Gentoo安装详解(四)-- 声卡设置

    硬件检测 To choose the right driver, first detect the used audio controller. You can use lspci for this ...

  10. linux 网络命令