我想录制没有声音的原始h.264视频,并且可能加速HW(并稍后流式传输).所以我决定使用MediaRecorder(和套接字hack进行流式传输).
我有以下代码:
final MediaRecorder recorder = new MediaRecorder();
final Camera camera = Camera.open();
camera.unlock();
recorder.setCamera(camera);
recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
recorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
final CamcorderProfile profile = CamcorderProfile.get(CamcorderProfile.QUALITY_LOW);
recorder.setVideoSize(profile.videoFrameWidth, profile.videoFrameHeight);
recorder.setVideoFrameRate(profile.videoFrameRate);
recorder.setVideoEncodingBitRate(profile.videoBitRate);
recorder.prepare();
recorder.start();
Run Code Online (Sandbox Code Playgroud)
和bam!这在logcat中:
E/MediaRecorder? start failed: -38
Run Code Online (Sandbox Code Playgroud)
我开始谷歌搜索,发现了很多问题和答案,但没有关于我的错误代码-38.
所以我试着看看Android 源代码,并注意到它的native方法,我不知道在哪里寻找它.
所以我的一个大问题是:是否有一些错误代码列表,所以我可以找到错误的-38含义?`
也知道tjat我的目标是API 10(Gingerbread)并使用最新的SDK 21构建.
我正在尝试使用这篇文章来创建异步UDP套接字.
所以我有这个代码:
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Message;
import java.net.DatagramSocket;
import java.net.SocketException;
public class UdpThread
extends HandlerThread {
private static final String TAG = "UDP";
private final Handler uiHandler, workerHandler;
private final DatagramSocket socket = new DatagramSocket();
public UdpThread(final Handler uiHandler, final String hostname, final int port) throws SocketException {
super(TAG);
this.uiHandler = uiHandler;
start();
workerHandler = new Handler(getLooper(), new Handler.Callback() {
@Override
public boolean handleMessage(final Message msg) {
/*
if (msg.what == port && msg.obj == hostname) …Run Code Online (Sandbox Code Playgroud) 我正在尝试在设备之间流式传输视频。我想尽可能支持旧设备。所以我从MediaRecorderGingerbread (API 10) 的课程开始,但它有问题。所以现在,我要转向 Jelly Bean (API 16) 和MediaCodec.
我正在向 Camera 中的编解码器提供数据PreviewCallback。我必须使用相同的分辨率进行预览和编解码器。但是在我们的一些测试设备上,预览分辨率和编解码器及其分辨率之间没有交集。
那么,如何在这些设备上捕捉视频呢?我知道有 createInputSurfacein MediaCodec,但它需要 API 18,我将不得不削减超过 35%的设备,这是不可接受的。
那么如何解决呢?
寻找最佳分辨率的代码:
CamcorderProfile bestProfile() {
final int[] profiles;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
profiles = new int[]{CamcorderProfile.QUALITY_HIGH, CamcorderProfile.QUALITY_2160P, CamcorderProfile.QUALITY_1080P, CamcorderProfile.QUALITY_720P, CamcorderProfile.QUALITY_480P, CamcorderProfile.QUALITY_CIF, CamcorderProfile.QUALITY_QCIF, CamcorderProfile.QUALITY_LOW};
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
profiles = new int[]{CamcorderProfile.QUALITY_HIGH, CamcorderProfile.QUALITY_1080P, CamcorderProfile.QUALITY_720P, CamcorderProfile.QUALITY_480P, CamcorderProfile.QUALITY_CIF, CamcorderProfile.QUALITY_QCIF, CamcorderProfile.QUALITY_LOW};
} else {
profiles = new int[]{CamcorderProfile.QUALITY_HIGH, CamcorderProfile.QUALITY_LOW};
}
for (final …Run Code Online (Sandbox Code Playgroud) 我有一项服务,与onStartCommand()此类似:
private User user;
@Override
public int onStartCommand(@Nullable final Intent intent, final int flags, final int startId) {
if (user == null) {
user = UserList.getInstance().getSpecialUser();
}
Assert.assertNotNull(user);
//
// Build notification here, seomehow based on user object
//
startForeground(42, notification);
return START_STICKY;
}
Run Code Online (Sandbox Code Playgroud)
显然,我希望我的服务在前台运行,并尽可能长时间运行.
这很有效,直到我的应用程序崩溃到其网络类的深处.当发生时,是否显示应用程序崩溃对话框,用户确认它,重新创建整个应用程序,还重新创建服务,但UserList现在是空的,所以再次getSpecialUser()返回null并Assert重新启动应用程序.Android在主屏幕中放弃和用户结束.
有没有办法检测崩溃,这将使我能够更优雅地处理这种情况?
我知道有很多问题和答案,但它们都不适合我.
我的风格和主题:
<style name="AnnaTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!--
Colors,
and stuff
-->
<item name="android:dropDownItemStyle">@style/DropDownItemStyle</item>
<item name="android:spinnerDropDownItemStyle">@style/DropDownItemStyle</item>
<item name="spinnerDropDownItemStyle">@style/DropDownItemStyle</item>
</style>
<style name="DropDownItemStyle" parent="Widget.AppCompat.Light.DropDownItem.Spinner">
<item name="android:textColor">@android:color/black</item>
</style>
Run Code Online (Sandbox Code Playgroud)
但结果仍然如此:

布局是这样的:
<android.support.design.widget.TextInputLayout
android:id="@+id/til_email"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<AutoCompleteTextView
android:id="@+id/et_email"
android:layout_width="@dimen/join_field_width"
android:layout_height="wrap_content"
android:hint="@string/email"
android:inputType="textEmailAddress"/>
</android.support.design.widget.TextInputLayout>
Run Code Online (Sandbox Code Playgroud)
和适配器:
emailView.setAdapter(new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, Utils.getUniqueEmailsFromAccount(this)));
Run Code Online (Sandbox Code Playgroud)
你们能帮助我如何让文字变黑吗?
我在Android应用仪表板上的“获取”表中看到以下值:
有人可以告诉我他们之间有什么区别吗?例子是最好的!谢谢。
我有一个Activity带Fragment,并有大量的交易,所以后退按钮最经常只是回滚Fragment transaction.但我需要检测最后一次背压.
我不能使用onPause方法,因为当用户按下home或开始另一个活动时我不想做任何事情.
I've the following script to update my Nextcloud:
#!/bin/bash
set -ex
docker pull nextcloud
docker rm -f nextcloud
docker run -d -p 8080:80 -v nextcloud:/var/www/html --name nextcloud --restart=unless-stopped nextcloud
docker image prune -f
Run Code Online (Sandbox Code Playgroud)
The problem is, that it creates new container even when there was noting new to pull.
How can I check, if the docker pull actually pulled something, or if my image is already up-to-date? The exit code of docker pull is 0 in both situations.
是否有可能在when String默认情况下使比较大小写不敏感?
when (subtype.toLowerCase()) {
MessagingClient.RTC_SUBTYPE.sdp.toString().toLowerCase() -> onSDPMessageReceived(topic, sender, data!!)
MessagingClient.RTC_SUBTYPE.bye.toString().toLowerCase() -> onRTCBYEMessageReceived(topic, sender)
MessagingClient.RTC_SUBTYPE.negotiationOffer.toString().toLowerCase() -> onNegotiationOfferMessageReceived(sender, data!!)
}
Run Code Online (Sandbox Code Playgroud)
这有太多的重复代码!另外请注意,MessagingClient.RTC_SUBTYPE是enum class和subtype在第一行是从一些客户端收到的,所以我们必须相应地对待它.
让我们有以下(可变)映射:
1 -> A
45 -> A
88 -> R
98 -> X
105 -> A
Run Code Online (Sandbox Code Playgroud)
现在,我要删除所有指向的项目A。我想出了以下代码:
// Version 1
myMap.forEach { key, value -> if (value == "A") myMap.remove(key) }
// Version 2
with (myMap) {
val filtered = filterValues { it != "A" }
clear()
putAll(filtered)
}
Run Code Online (Sandbox Code Playgroud)
但是不知何故似乎都不对。那么正确,最优雅的方法是什么?
inline fun <T> rest(request: () -> T): T = try {
request()
} catch (e: HttpException) {
val requestId = e.response().raw().request().header(REQUEST_ID_HEADER)
if (requestId != null) {
Dialog(requestId, R.string.oops).show(fragmentManager, null)
} else {
throw e
}
}
Run Code Online (Sandbox Code Playgroud)
它应该执行一些REST请求(在request参数中),如果失败,并且包含指定的HTTP标头,则显示带有该标头的对话框。
但是编译器抱怨Dialog,它不返回T,而是Unit。但这基本上就是我想要的!我怎样才能做到这一点?
我想到的一个解决方案是将函数的返回类型设置为T?return null,但是在Kotlin中这样做很脏。
我正在扩展现有的 Java 类,它有一些私有方法。为了实现我想要的,我必须重写这个私有方法。
所以我读了一些关于 Java 反射的文章,并得出以下结论:
class CustomSlider : Slider() {
init {
Slider::class.java.getDeclaredMethod("drawTrack", Canvas::class.java, Int::class.java, Int::class.java).isAccessible = true
}
override fun drawTrack(canvas: Canvas, width: Int, top: Int) {
}
}
Run Code Online (Sandbox Code Playgroud)
但在线上override,我收到一条错误消息,表明这是不可能的。
那么我该怎么做呢?