我的应用程序需要通过http://127.0.0.1/...(localhost url)联系它正在处理的同一设备.
出于某种原因,当我到达那里有JSON内容的网站时,大约50%的时间(可能正好是50%),我得到例外:
java.net.SocketException:recvfrom失败:ECONNRESET(由对等方重置连接)
对于其他50%,我得到了非常好的结果.我试图进行民意调查(甚至民意调查之间的延迟很大),但我仍然得到同样奇怪的结果.
我搜索过互联网,也在这里,我不确定为什么会这样.对等方是否意味着客户端已经造成了这种情况?为什么会这样,我该如何处理?
一些网站说这是常见的事情,但我没有找到在这种情况下最好的事情.
对于我的10,000点,我决定用这个很酷的网站来点缀一些东西:一种在本机内存上缓存位图的机制.
Android设备的每个应用程序的内存量非常有限 - 堆的范围从16MB到128MB,具体取决于各种参数.
如果您通过此限制,则会获得OOM,当您使用位图时,这可能会发生多次.
很多时候,应用程序可能需要克服这些限制,对巨大的位图执行繁重的操作,或者只是存储它们以供以后使用,并且您需要
我想出的是一个简单的java类,它可以使事情变得更容易.
它使用JNI来存储位图数据,并能够在需要时恢复它.
为了支持该类的多个实例,我必须使用我发现的技巧(这里).
数据仍然存储在RAM中,因此如果设备没有足够的RAM,应用程序可能会被杀死.
记得尽快释放记忆.它不仅可以避免内存泄漏,而且还可以避免在您的应用程序到达后台时首先被系统优先处理.
如果您不想忘记释放内存,可以在每次还原位图时释放它,或者使类实现Closable.
作为一种安全措施,我已经使它在finalize()方法中自动释放其本机内存,但不要让它负责这项工作.风险太大了.当这样的事情发生时,我也写了它写入日志.
它的工作方式是将整个数据复制到JNI对象中,为了还原,它从头开始创建位图并将数据放入其中.
正在使用和恢复的位图采用ARGB_8888格式.当然,您可以将其更改为您想要的任何内容,只是不要忘记更改代码...
大位图可能需要一些时间来存储和恢复,因此在后台线程上执行它可能是明智的.
这不是一个完整的OOM解决方案,但它可能有所帮助.例如,您可以将它与您自己的LruCache结合使用,同时避免将堆内存用于缓存本身.
代码仅用于存储和恢复.如果您需要执行某些操作,则需要进行一些研究.openCV可能就是答案,但是如果你想要执行一些基本的东西,你可以自己实现它们(这里是使用JNI旋转大图像的例子).如果你知道其他选择,请在这里告诉我.
希望这对某些人有用.请写下你的意见.
此外,如果您发现代码有任何问题或建议填补,请告知我们.
如果您希望在JNI端执行更多操作,您可以使用我所做的这篇文章.它基于我在这里编写的代码,但允许您进行更多操作,您可以轻松添加更多自己的代码.
我注意到新的RecyclerView类,虽然它使事情变得更清洁,但缺乏我熟悉的许多功能:
这些是我使用的,但也许还有其他我错过了.
是否有任何教程或一些指导如何替换这些东西?
android android-listview android-gridview android-recyclerview
Android上并不支持手机录音,但有些设备在某种程度上支持它.
这使得各种呼叫录制应用收集了关于设备的可能信息以及应该对它们做什么,并决定该做什么.
有些甚至提供根解决方案.
一个这样的例子是boldbeast Call Recorder应用程序,它提供了许多不同的配置来改变:
"记录模式".显示非root用户设备的14种模式,root用户最多34种模式.对于root设备,还显示"Alsa mode"作为它的选项.
具有"调谐音频效果"("自动调整一组参数").
具有"调谐音频路由",可能的值为"已禁用","组1","组2","组3"
对于有根设备:
"更改音频控件"("自动更改音频控件")
"更改音频驱动程序"(更改音频驱动器设置以启用记录模式21,22,23,24,31,32,33,34")
对于有根设备:"开始输入流"
如果我需要创建一个呼叫录制应用程序,除了找到各种设备的各种解决方法之外别无他法,但似乎其他应用程序使用API中没有出现的术语.
例如,我找不到我提到的任何应用程序中的任何一个.
除了大量关于如何在Android上录制电话的问题,显示它不适用于所有设备,我可以找到一些有趣的东西.以下是我到目前为止的尝试和见解:
我们可以在准备录音时使用一些录音源(这里是文档),但遗憾的是在每个设备中它可能会有所不同.对于一些人来说,VOICE_CALL是有效的,对某些人来说也是如此.但至少我们可以尝试......
在安装了Android 6.0.1的OnePlus 2上,可以使用VOICE_CALL录制来电,但是我无法在那里录制拨出电话,除非我将MIC作为音频源与扬声器开启一起使用.不知何故,我提到的应用程序成功录制它没有任何问题.我相信我会看到其他Android设备的其他问题,因为我过去曾试图解决这个问题.更新:我发现了这个示例项目(也在这里),由于某种原因,它在UI线程prepare和startmediaRecorder调用之间休眠2秒.它工作正常,当我做类似的事情(等待使用Handler.postDelayed 1秒),它也工作得很好.在那里写的评论是"有时准备需要一些时间才能完成".
在使用Android 8的Galaxy S7上,无论我做了什么,我都无法获得传出呼叫和来电(即使是MIC和扬声器)的另一方声音,但我提到的应用程序运行正常.
为了让你尝尝我的通话录音的POC,我已经发表了开放源代码的github仓库在这里,有一个样品,将记录一个电话,让你聆听到最新的一个,如果一切运作良好.
这个"ViktorDegtyarev - CallRecLib"SDK似乎根本不起作用,并在各种Android版本上崩溃
这两个旧的示例项目:rvoix,esnyder-callrecorder,都无法实际记录.第二个似乎甚至不适用于它应该支持的Android 6.0.1设备.
aykuttasil - CallRecorder示例和 axet - android-call-recorder示例 - 两者,就像在我的POC上一样,除了AudioSource之外没有任何调整,因此他们无法记录某些情况,例如OnePlus 2输出 -拨出电话的音频.
大多数第三方应用程序仅提供AudioSource调整,但有些(如"boldbeast")确实提供更多.一个例子是" 自动呼叫记录器 ",其具有"配置"(10个值可供选择,首先是"默认")和"方法"(5个值可供选择,首先是"默认").这些应用程序可能不希望其他人理解这些配置的含义,因此他们会使用通用名称.或者,它对每个人来说都太复杂了(特别是对于用户而言),所以他们概括了名称.
有"setMode"的API 在这里,但它似乎并不在调用它改变.我想也许可以通过这种方式改变呼叫使用位置的"通道",但它不起作用.它在调用期间保持为"2"的值,即MODE_IN_CALL.
有各种设备可用的自定义参数(每个OEM及其自己的参数),这些参数可以在这里设置,甚至可以通过JNI( …
我有一个简短的问题:
假设我有一个(可变的)位图,我需要修改(添加图像,文本等...).
我没有考虑使用许多特殊的类来绘制画布(画布,画布,矩阵等),而是考虑为什么不使用Android的内置类来完成这项任务,只有当我需要真正定制的操作时,我仍然可以使用画布?
因此,例如,为了在位图上显示任何类型的视图(当然没有父视图),我可以调用下一个函数:
public void drawViewToBitmap(Bitmap b, View v, Rect rect) {
Canvas c = new Canvas(b);
// <= use rect to let the view to draw only into this boundary inside the bitmap
view.draw(c);
}
Run Code Online (Sandbox Code Playgroud)
这样的事情可能吗?也许这就是它在幕后工作的方式?
我应该在绘图和画布创作之间的部分写什么?
编辑:我已经尝试了下一个代码,但它没有工作:
public void drawFromViewToCanvas(final View view, final Rect rect, final Canvas canvas) {
final int widthSpec = View.MeasureSpec.makeMeasureSpec(rect.width(), View.MeasureSpec.EXACTLY);
final int heightSpec = View.MeasureSpec.makeMeasureSpec(rect.height(), View.MeasureSpec.EXACTLY);
view.measure(widthSpec, heightSpec);
// Lay the view out with the known dimensions
view.layout(0, 0, rect.width(), rect.height());
// …Run Code Online (Sandbox Code Playgroud) 最近我们将Facebook SDK库更新到4.10(从这里开始).
在此之前,我们偶尔会遇到同样的错误,但现在它似乎经常发生.
我们无法理解它发生的位置和原因.
这是崩溃日志:
致命异常:显示java.lang.NullPointerException:尝试在上android.os.Parcel.readException(Parcel.java空对象引用调用接口方法"java.lang.Object中com.facebook.inject.Lazy.get()": 1552)在android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:190)在android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:142)在android.content.ContentProviderProxy.query(ContentProviderNative.java:421)在机器人. content.ContentResolver.query(ContentResolver.java:494)在android.content.ContentResolver.query(ContentResolver.java:429)在com.facebook.internal.NativeProtocol.fetchAllAvailableProtocolVersionsForAppInfo(NativeProtocol.java:790)在com.facebook.internal .NativeProtocol.access $ 000(NativeProtocol.java:49)在com.facebook.internal.NativeProtocol $ NativeAppInfo.fetchAvailableVersions(NativeProtocol.java:281)在com.facebook.internal.NativeProtocol $ NativeAppInfo.access $ 600(NativeProtocol.java:226 )在com.facebook.internal.NativePro 母生育酚$ 1.run(NativeProtocol.java:763)在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)在java.util.concurrent.ThreadPoolExecutor中的$ Worker.run(ThreadPoolExecutor.java:587)在爪哇. lang.Thread.run(Thread.java:818)
而且,既然这是Crashlytics的一份报告,我也有一些统计数据:
我试着寻找异常,但我找不到任何类似的东西.
我试图找到"com.facebook.inject.Lazy"类,但这是无处可寻的.我甚至找不到注入相关的类和repos sdk用于正常使用.仅适用于单元测试.
我也试图去Facebook的Github网站(这里),但没有地方写在那里.
后来我发现这是在Facebook的开发者网站上报道的,但它似乎不会被修复,没有人知道如何处理它.
编辑:现在我发现这篇Facebook帖子,说这可能是因为使用旧版本的Facebook应用程序,但似乎这是不正确的.
它为什么会发生?这有什么解决方法吗?Facebook是否正在修复此问题?
是否有任何版本的Facebook SDK没有发生此问题?
最重要的是,如何处理和修复?
GridView是一个扩展 AdapterView的类,这意味着它可以有效地显示网格样式的单元格,并在用户滚动时回收旧视图以显示为新视图.
有时,您希望获得一个特殊的UI,它类似于Windows Phone Tiles UI,具有不同大小的单元格.
像这样的东西:
AABB
AACC
AADD
AADD
Run Code Online (Sandbox Code Playgroud)
每个字母代表其细胞的一部分,因此细胞A是2x4,细胞B和细胞C各占2x1,细胞D是2x2.
它可能甚至更多,其中单元格D比我所示的稍微高一点,并且在它下方有另一个单元格,因此D的末端和A的末尾不必对齐.
具有这种风格的应用程序的一个例子是pinterest.
GridView不允许这样的事情.
事实上,我尝试的每个解决方案都有问题.想问一下是否有其他替代品或更好的解决方案.
有多种方法可以解决此问题:
作为扩展AdapterView 的类,GridView可以为每个项目设置一个类型(使用BaseAdapter),这将允许您设置如何布局单元格.
但是,它仍会限制你,因为你会得到一排物品,一个在另一个之下.你必须让它们对齐.
GridLayout是一个相对较新的布局,它非常灵活.谷歌为它发布了一个很好的兼容性库,支持API7及更高版本.
但是,它不使用任何视图的回收,因此如果您希望显示大量项目,这是一个糟糕的选择.
如果您有很多项目,则需要为它们创建所有视图.
QuiltView库 - 从GridLayout扩展,所以基本上有类似的问题.
StaggeredGridView - 看起来最有前途,但有很多错误,特别是在改变方向时.这样的错误包括空单元格,坏滚动和NPE(罕见但仍然发生).我也不确定它是否支持单独使用自定义单元而不是imageView.
其他解决方案,如此处所述.
有谁知道这个问题的另一种替代方案?对于我展示的任何解决方案,可能有一些解决方法吗?
编辑:我认为关于StaggeredGridView,滚动和异常可以通过使用在getView中设置其大小的普通ImageView来解决.我认为它以一种奇怪的方式工作的原因是样本在从互联网加载后更新了imageview的大小.
但是,空单元格问题仍然存在于此库中.不仅如此,即使不改变方向,它们的尺寸也会发生很大变化.
编辑:目前,我认为最好的解决方案是使用 PinterestLikeAdapterView库.
它没有我能找到的任何问题.
但是,它不能使项目占用超过1个单元格宽度.尽管如此,这还是非常好的.
编辑:遗憾的是它与notifyDataSetChanged有问题.我在这里报道了这件事.
android cells android-gridview android-adapterview android-gridlayout
注意:我尝试了在 StackOverflow 上写的各种解决方案(这里的例子)。请不要在没有使用我在下面编写的测试中检查您发现的解决方案是否有效的情况下关闭它。
对应用程序有一个要求,即用户将提醒设置为在特定时间安排,因此当应用程序在这个时间被触发时,它会在后台做一些微小的事情(只是一些数据库查询操作),并显示一个简单的通知,讲述提醒。
过去,我用一个简单的代码来设置一些在相对特定的时间被调度的东西:
val alarmManager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
val pendingIntent = PendingIntent.getBroadcast(context, requestId, Intent(context, AlarmReceiver::class.java), PendingIntent.FLAG_UPDATE_CURRENT)
when {
VERSION.SDK_INT >= VERSION_CODES.KITKAT -> alarmManager.setExact(AlarmManager.RTC_WAKEUP, timeToTrigger, pendingIntent)
else -> alarmManager.set(AlarmManager.RTC_WAKEUP, timeToTrigger, pendingIntent)
}
Run Code Online (Sandbox Code Playgroud)
class AlarmReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
Log.d("AppLog", "AlarmReceiver onReceive")
//do something in the real app
}
}
Run Code Online (Sandbox Code Playgroud)
用法:
val timeToTrigger = System.currentTimeMillis() + java.util.concurrent.TimeUnit.MINUTES.toMillis(1)
setAlarm(this, timeToTrigger, 1)
Run Code Online (Sandbox Code Playgroud)
我现在已经在新 Android 版本和带有 Android 10 的 Pixel 4 上的模拟器上测试了此代码,它似乎没有触发,或者它可能在我提供它很长时间后触发。我深知的 …
我正在玩DrawerLayout,我遇到了一个问题.基本上有时当我从屏幕边缘滑动时,DrawerLayout会卡住,直到我将手指从屏幕上抬起(参见下面的屏幕截图)
我不确定是什么,我完全按照谷歌sdk的代码示例.有任何想法吗?

这是我在FragmentActivity中唯一拥有的东西:
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final String[] names =
getResources().getStringArray(R.array.nav_names);
ArrayAdapter<String> adapter =
new ArrayAdapter<String>(
getActionBar().getThemedContext(),
android.R.layout.simple_list_item_1, names);
final DrawerLayout drawer =
(DrawerLayout)findViewById(R.id.drawer_layout);
final ListView navList =
(ListView) findViewById(R.id.drawer);
navList.setAdapter(adapter);
navList.setOnItemClickListener(new AdapterView.OnItemClickListener()
{
@Override
public void onItemClick(AdapterView<?> parent,
View view, final int pos, long id)
{
drawer.setDrawerListener(
new DrawerLayout.SimpleDrawerListener()
{
@Override
public void onDrawerClosed(View drawerView)
{
super.onDrawerClosed(drawerView);
}
});
drawer.closeDrawer(navList);
}
});
}
Run Code Online (Sandbox Code Playgroud)
编辑:我正在为此添加赏金,因为这是一个非常古老的问题,即使在今天仍然存在最新的Android-X(此处提供样本).以下是它的外观:
我在这个帖子上尝试了所有现有的解决方案,但都没有.如果有人有一个很好的解决方法(虽然仍然使用DrawerLayout或扩展它,或类似的东西),请提出一个有效的解决方案.
我有一个小型动态壁纸应用程序,我想添加支持它来显示GIF动画.
为此,我找到了各种解决方案.有一种在视图(这里)中显示GIF动画的解决方案,甚至还有一个解决方案,可以在动态壁纸(这里)中显示它.
但是,对于它们两者,我无法找到如何在其所拥有的空间中很好地拟合GIF动画的内容,这意味着以下任何一种情况:
这些都不是关于ImageView的,所以我不能只使用scaleType属性.
有一个解决方案可以为你提供一个GifDrawable(这里),你可以在ImageView中使用它,但在某些情况下它似乎很慢,我无法弄清楚如何在LiveWallpaper中使用它然后适合它.
LiveWallpaper GIF处理的主要代码就是这样(这里):
class GIFWallpaperService : WallpaperService() {
override fun onCreateEngine(): WallpaperService.Engine {
val movie = Movie.decodeStream(resources.openRawResource(R.raw.cinemagraphs))
return GIFWallpaperEngine(movie)
}
private inner class GIFWallpaperEngine(private val movie: Movie) : WallpaperService.Engine() {
private val frameDuration = 20
private var holder: SurfaceHolder? = null
private var visible: Boolean = false
private val handler: Handler = Handler()
private val drawGIF …Run Code Online (Sandbox Code Playgroud)