Articles of java的

编辑文本视图,图像和文本环绕图像

我正在构建一个富文本编辑器。 我已经实现了像粗体斜体等文本格式以及像blockQuote这样的段落格式。 现在我想在编辑器中添加图像,文本应该环绕它。 我已经使用SpannableString()和SpannableString()以及SpannableString()实现了所有这些。 我可以使用ImageSpan()将图像添加到一行,但是将其添加到内联中并且只是在那里添加一个字符,我想要的是将其插入段落中,其余文本应该环绕它。 我可以通过以下代码在文本的开头添加图像..但我无法将其对齐到中心和右边。 SpannableString string = new SpannableString(“Text with icon and padding”); string.setSpan(new IconMarginSpan(bitmap, 30), 0, string.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 怎么做 ? 举个例子? 或者要遵循什么程序?

使用TreeTranslator重命名不适用于Kotlin的函数

我正在尝试根据AST(抽象语法树)重写在构建期间重命名Java接口中的方法和Kotlin接口中的函数。 对于这个问题,我们忽略了重命名方法/函数给调用带来的影响。 要find要重命名的方法/函数,我正在使用自定义注释和注释处理器。 我按照这些说明操作Java接口。 我创建了一个包含三个模块的新项目。 app模块,注释模块和注释处理器模块。 app模块是一个Android应用程序,包含两个独立的Java和Kotlin接口文件,每个接口文件都有一个带注释的方法/函数。 RenameJava.java package nl.peperzaken.renametest; import nl.peperzaken.renameannotation.Rename; public interface RenameJava { @Rename void methodToRename(); } RenameKotlin.kt package nl.peperzaken.renametest import nl.peperzaken.renameannotation.Rename interface RenameKotlin { @Rename fun functionToRename() } 注释模块是一个只包含@Rename注释的Java库,我们指定只在函数上允许它,我们说它只能在源代码中可见。 Rename.kt package nl.peperzaken.renameannotation @Target(AnnotationTarget.FUNCTION) @Retention(AnnotationRetention.SOURCE) annotation class Rename 注释处理器模块是一个Java库,它只包含迭代具有注释的元素并对其进行转换的处理器。 RenameProcessor.kt package nl.peperzaken.renameprocessor import com.google.auto.service.AutoService import com.sun.source.util.Trees import com.sun.tools.javac.processing.JavacProcessingEnvironment import com.sun.tools.javac.tree.JCTree import com.sun.tools.javac.tree.TreeTranslator […]

Android上通过TCP套接字传输音频

我通过套接字从C服务器传输麦克风输入。 我知道流是有效的,因为它与C客户端有关,我在Android客户端上获得了正确的值。 我正在播放1024 flatarray。 一个浮点数是4个字节。 所以我得到了一个每帧4096字节的传入流。 我从这个字节中获取浮点数,我知道这些浮点数是我发送的,所以该部分应该工作。 现在我希望使用AudioTrack将该流直接传送到手机扬声器。 我试着输入我直接收到的字节:只是噪音。 我试着将它强制转换为字节数组,仍然是相同的。 我试图将那个浮点数转换为简短(因为AudioTrack占用字节或短)。 我可以得到一些可能是我的麦克风输入(敲门),但非常沙哑,而且非常迟钝。 我会理解帧之间是否存在延迟,但我甚至无法得到一个清晰的声音。 然而,我可以清楚地输出一个我本地产生的声音,然后放入那个短小的声音。 现在我想知道我的代码中是否有一些问题你可以看到,因为我没有看到它们。 我正在做的是:我在一个字节数组中放入4个字节。 我把浮子拿出来了。 一旦我在我的浮动数组中得到一个帧(我用bool控制它,不好,但它应该工作)我把它放在我的短片中,让audiotrack播放它。 这种双重演员可能会很慢,但我这样做是因为它是我最接近实际输入的。 编辑:我通过比较浮点数来检查结束,它们具有介于-1和1之间的正确值,并且与我发送的值相同。 由于我在转换为浮动时不改变endianess,我不明白为什么直接将4096字节数组转发到AudioTrack也不起作用。 multithreading可能有问题,但我不知道它可能是什么。 编辑2:我发现了一个小问题 – 我在1023重置了j。但是那个丢失的浮点数应该不是问题。 除了那个之外我做的是将从套接字中获取流的方法放在另一个线程中,而不是在异步任务中调用它。 这使它工作,我现在能够理解麦克风的声音。 质量仍然很差 – 代码中可能有这样的原因吗? 我也有大约10秒的延迟。 只有大约半秒钟是由WLAN引起的,所以我想知道它是否可能是代码故障。 任何进一步的想法表示赞赏 编辑3:我玩了代码并在评论中实现了一些greenapps的想法。 使用新的线程结构,我遇到了没有声音的问题。 像一样。 我不知道怎么可能,所以我换回来了。 我试图让线程更轻量级的其他东西没有任何影响。 我有一个延迟,我的质量很差(我可以识别敲门声,但我无法理解声音)。 我认为我的转换可能有问题,所以我把我从套接字收到的字节直接放在AudioTrack中 – 只有丑陋的脉冲静态噪音。 现在我更加困惑,因为这个确切的流仍然适用于C客户端。 如果我find解决方案,我会报告,但仍然欢迎任何帮助。 编辑4我应该添加,我可以从另一个Android应用程序播放麦克风输入,我直接将该输入作为字节发送(我将排除浮动投射的东西,并将我直接接收的字节放入我的播放器代码中的audioTrack)。 它也发生在我身上,这可能是一个问题,由C服务器流式传输的所述floatarray来自64位机器,而手机是32位。 这可能是一个问题,即使我只是将浮动数据传输为4个字节? 或者,我的另一个想法:我收到的字节的基础数字格式是浮点数。 AudioTrack期望什么格式? 即使只放入字节 – 我是否需要将该浮点数转换为int并将其转换回字节或其他内容? 新代码: public class […]

使用Android的Mobile Vision API扫描QR码

我按照本教程学习了如何构建可以扫描QR码的Android应用程序。 这是完整的代码。 我使用等级添加了Google Play服务,因此compile ‘com.google.android.gms:play-services:7.8.0’ 。 AndroidManifest.xml中 activity_main.xml中 MainActivity.java package bitinvent.io.qrscanner; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.util.SparseArray; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.widget.TextView; import com.google.android.gms.vision.CameraSource; import com.google.android.gms.vision.Detector; import com.google.android.gms.vision.barcode.Barcode; import com.google.android.gms.vision.barcode.BarcodeDetector; import java.io.IOException; public class MainActivity extends Activity { private SurfaceView cameraView; private TextView barcodeInfo; private CameraSource cameraSource; @Override protected void onCreate(Bundle savedInstanceState) […]

Android4OpenCV:启动时设置分辨率

我正在使用Android4OpenCV进行实时image processing,我想使用相机可以提供的最小分辨率。 默认分辨率是相机可以提供的最大分辨率。 我正在看第三个例子 ,它允许用户通过菜单更改分辨率。 我想修改该示例以在启动时更改分辨率,而不是要求用户通过菜单。 为此,我只需在空的onCameraViewStarted()函数中添加两行: public void onCameraViewStarted(int width, int height) { android.hardware.Camera.Size res = mOpenCvCameraView.getResolutionList().get(mOpenCvCameraView.getResolutionList().size()-1); mOpenCvCameraView.setResolution(res); } 事实是,这在我的Galaxy Nexus上运行Android 4.2.2非常合适。 应用程序启动,分辨率设置正确。 但是,当我在运行Android 5.1的Nexus 7平板电脑上运行完全相同的应用程序时,应用程序会挂起对setResolution()的调用。 实际上它可以正常工作,但是第二次尝试运行它时会挂起 – 即使您完全退出应用程序,将其从正在运行的应用程序中删除,或重新启动设备。 其他用户也报告了相同的错误,因此它不仅仅是Nexus 7设备 – 事实上,我的Galaxy Nexus似乎是唯一可用的设备。 具体来说,应用程序进入setResolution()函数,然后调用org.opencv.android.JavaCameraView.disconnectCamera() ,如下所示: (注意:此代码是OpenCV4Android库的内部,这不是我的代码) protected void disconnectCamera() { /* 1. We need to stop thread which updating the frames * 2. […]

双向无限/动态ViewPager

有一个ViewPager用例,我从来没有见过相当实现。 ViewPager是静态结构。 将页面添加到右侧(附加到模型并显示它)并不是那么困难,但是,应该有一个很好用的解决方案来扩展PagerAdapter(或其某些子类),以便它可以在两个方向上扩展。 我可以想象这样的接口适配器 boolean isEmpty() boolean hasNext() boolean hasPrevious() Object getNext() Object getPrevious() Object getItem(int position) // or if using generics T getNext() T getPrevious() T getItem(int position) 与Collections Iterator类似,但都是双向的。 索引/位置不限于0以下,但可以使用整个范围的整数types。 也许不是基于数组的实现(从0到无限)。 我发现这个“hack”: 动态添加和删除view到viewpager 但正如我之前所说的那样,我试图让它自然地工作,而不是维护3,5,…项目并迫使ViewPager根据一些扭曲的逻辑改变当前的位置 目前是否有足够的实施或是否有必要实施它? 如果这将是一个全新的实施,我愿意赏金奖励回答。

AsyncTask varargs参数的用途

Google在AsyncTask使用varargs的原因是什么? 例如,方法execute() , doInBackground()和publishProgress()都使用[Type]…表示法。 我认为这使得“更难”使用,所以他们必须有一些我忽略的好理由? 所以,要么我们没有参数,要么有一个或多个参数。 让我们分解一下: 没有参数 (简单): Params参数是Void ,就是这样。 (方法不能使用它……所以这很安全。) 一个参数 :至少在这里,我觉得需要在doInBackground()方法的开头进行检查。 例如,这是一个接收Integer并生成Doubletypes结果的任务: public Double doInBackground(Integer… myParameters) { // we are only expecting one parameter if (myParameters.length != 1) throw new IllegalArgumentException(“!= 1”); return 100d * myParameters[0]; } 多个参数 。 现在这里必须是Google做出正确选择的地方吗? 但正如我所看到的那样,您要么对相同types的参数列表感兴趣,要么需要不同types的参数。 谷歌只解决了其中一种情况(不同types你需要某种通用界面。在很多情况下,我最终得到了Object…而且这种方式并不真正安全……) 那么,如果我们完全删除varargs会有什么问题呢? 这是方法的一个子集: class AsyncTask { abstract Result doInBackground(Param param); void […]

应用程序仅在发布版本中崩溃

在调试模式下运行应用程序时,应用程序无法崩溃。 但是当生成.apk文件时释放应用程序崩溃。 所有手机上都没有出现此错误 ,只有少数拥有android 6的手机 。 logcat显示问题是类中的NullPointerException ( android.support.v4.widget.drawerlayout )。 NullPointerException如何仅在发布apk上启动? 我们已经禁用了proguard,minify和shrinkResources。 没有解决这个bug。 这里有一些日志: Attempt to invoke virtual method ‘int android.view.WindowInsets.getSystemWindowInsetLeft()’ on a null object reference at android.support.v4.widget.ia(Unknown Source) at android.support.v4.widget.DrawerLayout$da(Unknown Source) at android.support.v4.widget.DrawerLayout.onMeasure(Unknown Source) at android.view.View.measure(View.java:18799) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951) at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) at android.support.v7.widget.ContentFrameLayout.onMeasure(Unknown Source) at android.view.View.measure(View.java:18799) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)

获取连接到Android设备的所有存储设备的路径列表

我想获取连接到Android设备的所有存储设备的列表。 例如 – 内部存储(存储所有文件夹,如下载,DCIM等),SD卡和OTG设备。 我知道有很多StackOverflowpost讨论了这个主题,但没有一个可以满足我的目的,如上所述。 我可以通过调用Environment.getExternalStorageDirectory().getPath()来获取内部存储,它返回内部存储的路径。 任何有关这方面的帮助都会非常感激,因为没有标准的AFAIK可以检索所有连接的存储设备的列表。 此外,许多解决方案不适用于不同的设备和Android版本。

GAE必须首先调用set * BlobStorage()之一

我也搜索了谷歌,stackoverflow和其他来源。 但到目前为止没有运气。 我正在开发一个GAE应用程序,后端是Java,另一端是android。 现在服务器是在本地机器上设置的,它是由android通过wifi使用ip地址访问的。 在尝试上传图片时,我首先请求uploadUrl,我成功了。 唯一的问题我看到有而不是PC IP地址,它有个人电脑名称。 所以现在我将pc名称替换为ip地址。 在我实际尝试发布多部分图像文件之后,它抛出exceptionjava.lang.IllegalStateException: Must call one of set*BlobStorage() first 现在我无法通过这个障碍。 我看到了可能的原因 我正在将PC名称更改为ip地址 – 使链接无效altogather 如某处读到这个url只能被点击一次,但我只打了一次。 开发环境是问题,只剩下解决方案就是部署它? 请帮帮我。 对此严重困扰。 非常感谢提前 更新 – 2015年12月4日 SEVERE: javax.servlet.ServletContext log: unavailable java.lang.IllegalStateException: Must call one of set*BlobStorage() first. at com.google.appengine.api.blobstore.dev.BlobStorageFactory.getBlobStorage(BlobStorageFactory.java:24) at com.google.appengine.api.blobstore.dev.UploadBlobServlet.init(UploadBlobServlet.java:102) at javax.servlet.GenericServlet.init(GenericServlet.java:212) at org.mortbay.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:440) at org.mortbay.jetty.servlet.ServletHolder.getServlet(ServletHolder.java:339) at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166) at com.google.appengine.api.socket.dev.DevSocketFilter.doFilter(DevSocketFilter.java:74) […]