【问题标题】:start and close an app depending if battery is being charged or not根据电池是否正在充电启动和关闭应用程序
【发布时间】:2012-09-20 12:14:00
【问题描述】:

我想创建一个简单的 Blackberry 应用程序,该应用程序在我为手机充电时播放音频文件,并在我拔下电源时关闭该应用程序。

伪代码

  1. 插入电池线后启动应用程序,

  2. 应用程序在充电时连续播放声音

    不能让它在没有间隙的情况下循环播放,而是播放声音

  3. 如果用户拔掉电缆,停止流,播放声音,停止流

  4. 可选:如果电池电量下降到严重/完成充电,播放声音

查看文档,我认为没有听众可以告诉您电池电量是否为 100%。

编辑:找到通过 batteryStatusChange 的方法,感谢 Nate 帮助我

出现空异常错误。

编辑:使用 InputStream 并且不再出现 null 异常错误。将 wav 文件添加到 res 文件夹。下面的新代码以 100 的频率播放声音和两种不同的声音,一种用于 USB 连接,另一种用于 USB 断开连接。

public class HelloBlackBerryScreen extends MainScreen implements SystemListener2 {
    private BasicEditField basicEditField;
    private Player HEV;    
    private String wav;
    private InputStream stream;
    private int volume; //going to set volume from GUI using a drop down list, working on it currently

public HelloBlackBerryScreen() 
{
    super( MainScreen.VERTICAL_SCROLL | MainScreen.VERTICAL_SCROLLBAR );
    setTitle( "HelloBlackBerry" );
    add(new RichTextField("Battery", RichTextField.TEXT_ALIGN_HCENTER));

    Application.getApplication().addSystemListener(this);
    
    wav = "voice_on.wav";
    stream = (InputStream)this.getClass().getResourceAsStream("/" + wav);               
    try {
        HEV = Manager.createPlayer(stream, "audio/wav");
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (MediaException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

public void batteryGood() {
    // TODO Auto-generated method stub
    
}

public void batteryLow() {
    // TODO Auto-generated method stub
    
}

public void batteryStatusChange(int status) 
{
    // TODO Auto-generated method stub
    if ((status & DeviceInfo.BSTAT_LEVEL_CHANGED) != 0)
    {
        if(DeviceInfo.getBatteryLevel() == 100)
        {
            try 
            {
                setWav("power_level_is_100_percent.wav"); 
                HEV.start();
                stream.close();
            } 
            catch (MediaException e) 
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } 
            catch (IOException e) 
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }               

        }               

    }
}   

public void powerOff() {
    // TODO Auto-generated method stub
    
}

public void powerUp() {
    // TODO Auto-generated method stub
    
}

public void backlightStateChange(boolean on) {
    // TODO Auto-generated method stub
    
}

public void cradleMismatch(boolean mismatch) {
    // TODO Auto-generated method stub
    
}

public void fastReset() {
    // TODO Auto-generated method stub
    
}

public void powerOffRequested(int reason) {
    // TODO Auto-generated method stub
    
}

public void usbConnectionStateChange(int state) 
{
    // TODO Auto-generated method stub
    if (state == USB_STATE_CABLE_CONNECTED) 
    {           
        try 
        {
            setWav("suitchargeok1.wav"); 
            HEV.start();
            stream.close();
        } 
        catch (MediaException e) 
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 
        catch (IOException e) 
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }       
        
        } 
        else if (state == USB_STATE_CABLE_DISCONNECTED) 
        {
            try 
            {
                stream.close();
                setWav("battery_pickup.wav"); 
                HEV.start();
                stream.close();
            } catch (MediaException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();                    
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
        }
}

public String getWav() {
    return wav;
}

public void setWav(String wav) {
    this.wav = wav;
    stream = (InputStream)this.getClass().getResourceAsStream("/" + this.wav);
    try {
        HEV = Manager.createPlayer(stream, "audio/wav");
        HEV.realize();
        VolumeControl volume = (VolumeControl) HEV.getControl("VolumeControl");
        volume.setLevel(25);
        HEV.prefetch();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (MediaException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

public boolean onClose()
{
    UiApplication.getUiApplication().requestBackground();
    return true;
}

}

【问题讨论】:

  • 你真的希望你的应用程序有任何图形用户界面,还是纯粹是一个只播放声音的后台应用程序?

标签: java eclipse blackberry


【解决方案1】:

我需要进一步说明您希望应用程序如何工作(请参阅我在您问题下方的评论),但我很确定您将需要实现 SystemListener(实际上, SystemListener2,是SystemListener的一种)来监听USB状态变化。

类似这样的东西来检测连接:

void usbConnectionStateChange(int state) {
   if (state == USB_STATE_CABLE_CONNECTED) {
      // start playing your sound
   } else if (state == USB_STATE_CABLE_DISCONNECTED) {
      // stop playing your sound, and exit, or just stay in the background
   }
}

Here is a link on how to add/register a System Listener on device startup

See this BlackBerry forums link on detecting USB connection

And the API docs on SystemListener2, too

更新:我相信发帖人已经弄清楚了(基于问题中的代码更新),public void batteryStatusChange(int status) 方法可能是在这里使用的更直接的回调。不过,其他一切都是一样的,因为这只是 SystemListener 中的另一个回调。

【讨论】:

  • 嗨,Nate,后台应用程序就可以了。用于检测手机是否正在充电的代码呢?下面的这个线程显示了如何做到这一点,但我猜它更适合使用 systemListener2 ?stackoverflow.com/questions/8214231/…
  • 另外,为了实现这一点,我必须在重启手机后启动一个后台应用程序?有没有办法像“充电时显示时钟选项”一样启动它
  • @user1615805,您发布的链接(史密斯先生的回答)看起来不错。但是,这只是询问设备是否正在充电的代码。当充电开始或停止时,您确实需要通知,这有点不同。一般来说,USB连接时会发生充电,对吧?我猜如果手机是 100% 充电,它可以在当前不充电的情况下连接。如果您愿意,您可以实现SystemListener2,然后在usbConnectionStateChanged 回调中,您可以执行史密斯先生回答中的代码以确保它正在充电。
  • @user1615805,您可能还需要考虑是否应该多次调用createPlayer()(如果 USB 已连接,然后断开,然后再次连接)。您可能需要createPlayer() 一次,将Player 实例作为成员变量,然后在该单个实例上调用start()stop()。同样,您必须进行试验。
  • 是的,它现在可以完美播放,试了 20 次,每次都播放,虽然当我第一次安装它时,它给了我一个 java lang 空异常错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-28
  • 2015-06-10
  • 2011-07-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多