小编Mis*_*ith的帖子

从屏幕截图生成视频供稿的替代方案

我在远程管理玩具项目中工作.现在,我可以使用Robot该类捕获屏幕截图并控制鼠标.截图是BufferedImage实例.

首先,我的要求: - 只有服务器和客户端. - 性能很重要,因为客户端可能是Android应用程序.

我想过打开两个套接字连接,一个用于鼠标和系统命令,另一个用于视频输入.

如何将屏幕截图转换为视频流?我应该将它们转换为已知的视频格式,还是可以发送一系列序列化图像?

压缩是另一个问题.根据我的初步测试,以全分辨率发送屏幕捕获将导致低帧速率.我认为我需要至少24 fps来感知运动,所以我要同时缩小和压缩.我可以转换BufferedImages为jpg文件,然后设置压缩率,但我不想将文件存储在磁盘上,它们应该只存在于RAM中.另一种可能性是将实例(表示未压缩的屏幕截图)序列化为GZipOutputStream.这是正确的方法是什么?

总结一下:

  • 如果您推荐"系列图像"方法,您如何将它们序列化到套接字OutputStream
  • 如果您的建议是转换为已知的视频格式,哪些类或库可用?

提前致谢.

更新:我的测试,客户端和服务器在同一台机器上
- 全屏幕序列化BufferedImages(只有维度,类型和int []),没有压缩:1.9 fps.
通过GZip流的完整屏幕图像:2.6 fps.
-Downscaled图像(640宽度)和GZip流:6.56 fps.
- 全屏幕图像和RLE编码:4.14 fps.
-Downscaled图像和RLE编码:7.29 fps.

java screenshot video-capture video-encoding

6
推荐指数
2
解决办法
2050
查看次数

Kotlin:如何绕过 CancellationException

我正在将一些旧的 RxJava 代码移植到 Coroutines。使用 RxJava,我可以在我的活动中做到这一点:

someBgOperation()
.as(AutoDispose.autoDisposable(AndroidLifecycleScopeProvider.from(MyActivity.this)))
.subscribe(
    MyActivity.this::onSuccess,
    MyActivity.this::onError
);
Run Code Online (Sandbox Code Playgroud)

如果活动正在关闭,自动处理库将取消 Observable。在这种情况下,RxJava 不会调用错误处理程序,因此可以在错误处理程序中安全地执行 UI 相关的操作,例如显示对话框。

现在,在 Kotlin 中,我们可以lifecycleScope在 Activity 中或在viewModelScope使用 ViewModel 的情况下启动此等效代码:

viewModelScope.launch {
    try {
        someBgOperation()
    } catch (e: Exception){
        //show dialog
    }
}
Run Code Online (Sandbox Code Playgroud)

当活动关闭时,两个作用域都会自动取消,就像 Autodispose 所做的那样。但是 catch 块不仅会执行someBgOperation它自己抛出的正常错误,还会执行CancellationException引擎盖下的协程库用来处理取消的 s。如果我在活动关闭时尝试在那里显示一个对话框,我可能会收到新的异常。所以我被迫做这样的事情:

viewModelScope.launch {
    try {
        someBgOperation()
    } catch (ce: CancellationException){
        //do nothing, activity is closing
    } catch (e: Exception){
        //show dialog
    }
}
Run Code Online (Sandbox Code Playgroud)

这感觉比 Rx 版本更冗长,并且它有一个空的 catch 子句,它会在 lint 输出中显示警告。在 try-catch …

android cancellation kotlin kotlin-coroutines

6
推荐指数
3
解决办法
931
查看次数

如何在代码中隐藏文字

在代码中隐藏文字值的主要现有方法是什么,因此只使用hexdumper或反编译器就不能轻易跟踪它们?

例如,而不是编码:

    static final int MY_VALUE = 100;
Run Code Online (Sandbox Code Playgroud)

我们可以有:

    static final int MY_VALUE = myFunction1();

    private int myFunction1(){
        int i = 23;
        i += 8 << 4;
        for(int j = 0; j < 3; j++){
            i-= (j<<1);
        }
        return myFunction2(i);
    }

    private int myFunction2(int i){
        return i + 19;
    }
Run Code Online (Sandbox Code Playgroud)

这只是我们要做的事情的一个例子.(是的,我知道,编译器可以优化它并预先计算常量).

免责声明:我知道这根本不会提供任何安全性,但它使代码更加模糊(或有趣)进行逆向工程.这样做的目的只是为了强制攻击者调试程序,并在其上浪费时间.请记住,我们这样做只是为了好玩.

literals hard-coding security-by-obscurity

5
推荐指数
1
解决办法
355
查看次数

在JavaME中实现阻塞队列:如何优化它?

我正在尝试在Java ME中实现一个简单的阻塞队列.在JavaME API中,Java SE的并发实用程序不可用,因此我必须像以前一样使用wait-notify.

这是我的临时实施.我正在使用notify而不是notifyAll因为在我的项目中有多个生产者,但只有一个消费者.我故意使用一个对象进行wait-notify来提高可读性,尽管它浪费了一个引用:

    import java.util.Vector;

    public class BlockingQueue {    
        private Vector queue = new Vector();
        private Object queueLock = new Object();    

        public void put(Object o){
            synchronized(queueLock){
                queue.addElement(o);
                queueLock.notify();
            }       
        }

        public Object take(){
            Object ret = null;
            synchronized (queueLock) {
                while (queue.isEmpty()){
                    try {
                        queueLock.wait();
                    } catch (InterruptedException e) {}
                }

                ret = queue.elementAt(0);
                queue.removeElementAt(0);
            }
            return ret;
        }
    }
Run Code Online (Sandbox Code Playgroud)

我的主要问题是关于put方法.我可以把queue.addElement线放出synchronized块吗?如果是这样,性能会改善吗

此外,同样适用于take:我可以采取两种操作queue出来的synchronized block …

java concurrency producer-consumer java-me

5
推荐指数
1
解决办法
895
查看次数

如何拦截来自Web表单的http POST数据

我有一个网页(显示在浏览器中,而不是 WebView),我想将一些数据(例如使用 http POST)传递给常规的 android 应用程序。

我只需要启动应用程序并输入数据即可。我知道可以通过注册一个意图过滤器来启动该应用程序,但是我在数据传递部分迷失了方向。

URL 不需要是真实的,虚假的 URL 就可以了。

这可以在 BlackBerry 中使用 HTTP 过滤器完成。有没有办法在Android中做同样的事情?

提前致谢。

browser android http intercept

5
推荐指数
1
解决办法
2524
查看次数

$ .Deferred:如何检测每个承诺何时执行

我有许多需要完成的异步任务,所以我使用的是promises.

我需要检测每个承诺何时被执行(解决和拒绝).在此之前我不能继续执行.

我使用的是这样的东西:

$.when(promise1, promise2, ...).always();
Run Code Online (Sandbox Code Playgroud)

但是这个代码是错误的,因为该when方法具有惰性求值,并且只要其中一个promise失败就会返回.因此,always只要其中一个承诺失败,回调也会运行.

我想在编码一个解决办法,但这种使用情况是如此普遍,也许有人已经做它已经,或者也许甚至还有这样做只使用jQuery的的一种方式(如果不是,这将是很好添加Promise.whenNonLazyPromise.when(promise1, promise2, ..., false)在未来.

这可能吗?

javascript jquery asynchronous promise jquery-deferred

5
推荐指数
1
解决办法
2049
查看次数

没有分隔符,java.time.DateTimeFormatter无法解析

java.time.LocalDateTime success = java.time.LocalDateTime.parse("20 01 2014 15 36 21 234",java.time.format.DateTimeFormatter.ofPattern("dd MM yyyy HH mm ss SSS"));             
java.time.LocalDateTime fails   = java.time.LocalDateTime.parse("20012014153621234",java.time.format.DateTimeFormatter.ofPattern("ddMMyyyyHHmmssSSS"));
Run Code Online (Sandbox Code Playgroud)

参考:http : //docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html

问题:格式化程序/解析器似乎无法区分固定项和可变项。例如。用作“ dd”的d =“ day-of-month”可以是一两位数字(例如8或18)。因此,解析器在尝试解析下一个“项目”时不使用“固定”长度。但是“项目”没有分开并且解析失败。

我对吗?有解决办法吗?

编辑:有趣的是,这工作:

java.time.LocalDate date1   = java.time.LocalDate.parse("20140120", java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd"));
java.time.LocalTime time1   = java.time.LocalTime.parse("153621234", java.time.format.DateTimeFormatter.ofPattern("HHmmssSSS"));
Run Code Online (Sandbox Code Playgroud)

但是为什么不选择日期和时间呢?

java parsing formatter datetime-format java-8

5
推荐指数
0
解决办法
1678
查看次数

迁移到Android Studio:如何更好地配置logcat视图

我正在从eclipse迁移到Android Studio.我在一些基本问题上遇到了困难,其中一个问题就是有效地检查日志.

在eclipse中,我经常检查logcat输出,最大化LogCat选项卡(双击选项卡以最大化,并再次最小化).这很快,可以从DDMS,Java或Debug角度完成.在Android Studio中,似乎只有一个透视图,DDMS框架固定在左下角.为了最大化,我现在发现的唯一方法是将窗口置于浮动模式(使用DDMS窗口角中的齿轮图标),然后调整其大小.为了最小化它,我再次单击齿轮图标并禁用浮动模式.

与eclipse相比,这是太多的工作.有没有更好的办法?

同样在logcat窗口中,在eclipse中显示所有列(时间,PID,TID,应用程序,标记,文本)并调整其大小.但是在Android Studio中我看不到列名,因此我不知道显示的是什么,并且无法调整列的大小.有没有配置列的方法?我在设置中找到的所有内容都是根据调试级别更改线条颜色的选项.

android logcat android-studio

5
推荐指数
1
解决办法
577
查看次数

Dagger 2:避免导出私有依赖项

假设我有一个模块,我只想导出一个实例A.但是,这A需要在构造函数中传递BC传递实例.所以我们也会在模块中声明它们:

public class SampleModule {

    @Provides
    @Singleton
    A provideA(B b, C c){
        return new A(b, c);
    }

    @Provides
    @Singleton
    B provideB(){
        return new B();
    }

    @Provides
    @Singleton
    C provideC(){
        return new C(); 
    }
}
Run Code Online (Sandbox Code Playgroud)

这工作,但现在BC也可在代码的其他地方.我希望将它们保密,并强制客户端类只能访问A.

有没有办法实现这个目标?

java android dependency-injection dagger dagger-2

5
推荐指数
1
解决办法
334
查看次数

GPS卫星数量和位置过滤

根据可用Location字段,在不考虑时间戳的情况下,浮动精度似乎是确定 GPS 位置好坏的主要字段。我想知道从 NMEA 数据(我认为是 $GPGGA)或通过LocationManager.getGpsStatus. 如何筛选高精度GPS位置?更具体地说,我也有兴趣了解:

  • 卫星数量越多,修复效果越好?我知道卫星的最小数量是 4 颗,但是是否可以说 8 颗卫星的定位比 6 颗卫星的定位要好得多?
  • 卫星数量不是已经包含在精度字段中了吗?
  • 互联网上的一些页面提到一个重要参数是 DOP(精度稀释)。似乎它出现在 $GPGSA NMEA 句子中。这句话在Android上可用吗?此外,哪些NMEA语句保证在Android中可用?

谢谢。

gps android location nmea satellite

3
推荐指数
2
解决办法
4565
查看次数