小编Ale*_*ohn的帖子

使用minSdkVersion管理Android项目中的"已弃用"警告

我讨厌警告.我们的Android项目现在有151个,而且我确信在列表的某个地方有一个实际上警告我们免受潜在的麻烦.

这些警告中的一种是关于不推荐使用的字段和方法.这可能很有用,除了Manifest包含<uses-sdk android:minSdkVersion="10" />,并且这些警告只考虑了targetSDK android-17.

可以轻松地将这些警告静音 - @SuppressWarnings("deprecation")在违规行或整个方法之前添加注释.但这忽略了它的全部要点 - 如果/当我们决定改变时minSdkVersion="11",在10级弃用的API仍然不会出现,并且有人将不得不在我们所有的项目中查看所有注释,以找到必须的代码被重写.

是否有一些解决方案可以根据我的minSdkVersion管理这些警告?


似乎Mark在下面发布了一个有趣的答案,甚至提出了一个受我的问题启发的功能请求,但我不同意minSdkVersion的重要性.他希望看到@TargetApi(NN)基于目标API级别的弃用警告(很可能来自Lint,类似于注释).但我不同意这种方法.

考虑一个打开相机的简单应用程序.它可能想要检查预览帧速率.但是这种方法在API 9中已弃用,现在我们必须检查预览FPS范围.如果我们使用platforms/android-8/android.jar,Java编译器将不会显示弃用警告.

但即使应用程序在支持此类查询的设备上运行,它也不允许我们找到首选的视频分辨率.我们可能会在@TargetApi(11)那里添加注释,以确保应用程序是使用platforms/android-11/android.jar或更高版本构建的.

现在我们已经定位了Honeycomb及更高版本,将为getPreviewFrameRate()显示弃用警告,这正是困扰我的.有一段时间,我想象的应用程序必须支持一些Froyo设备,因此我别无选择,只能设置minSdkVersion=8并使用已弃用的方法.当然,我将在条件块中使用任何高级API,并且已经@TargetApi(NN)到位.幸运的是,对于Donut和更高版本,当检测到对不存在的方法或成员的调用时,类加载器不会崩溃,并且仅仅在if()中包装可疑调用就足够了.

那我该怎么办?添加getPreviewFrameRate()@SuppressWarnings("deprecation")调用来静音警告?改为添加?@SuppressDeprecation(8)

但在某些时候,我将决定与Froyo的向后兼容性不再重要.我设置<uses-sdk android:minSdkVersion="9" />了我的Manifest,但getPreviewFrameRate()的弃用警告仍被抑制......好吧,新方法肯定比现有的注释更好,因为grep -R "@SuppressDeprecation(8)"在Manifest中进行更改后,整个项目更容易.

但我更喜欢这里更紧密的集成:让Lint为我解析Manifest文件. …

java eclipse android lint adt

11
推荐指数
2
解决办法
5937
查看次数

使用MediaRecorder录制mp4时获取/修改帧

我用以下代码录制mp4.但是在我录音的时候

1-是否可以以阵列数据或其他格式实时获取视频帧?

2-是否可以修改帧?例如,反转颜色并使其看起来是负面的.

public class MainActivity extends Activity implements OnClickListener, SurfaceHolder.Callback {
MediaRecorder recorder;
SurfaceHolder holder;
boolean recording = false;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

    recorder = new MediaRecorder();
    initRecorder();
    setContentView(R.layout.activity_main);

    SurfaceView cameraView = (SurfaceView) findViewById(R.id.surfaceView1);
    holder = cameraView.getHolder();
    holder.addCallback(this);
    holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

    cameraView.setClickable(true);
    cameraView.setOnClickListener(this);
}

private void initRecorder() {
    recorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
    recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);

    CamcorderProfile cpHigh = CamcorderProfile
            .get(CamcorderProfile.QUALITY_HIGH);
    recorder.setProfile(cpHigh);

    recorder.setOutputFile(Environment.getExternalStorageDirectory().getPath() + "/video.mp4");
    recorder.setMaxDuration(50 * 1000); // 50 seconds
    recorder.setMaxFileSize(5 * 1000000); // Approximately 5 megabytes
}

private …
Run Code Online (Sandbox Code Playgroud)

android android-camera android-mediarecorder

11
推荐指数
1
解决办法
6630
查看次数

Android:AsyncTask发出HTTP GET请求?

我是Android开发的新手.我的问题是,我是否使用AsyncTask来发出HTTP GET请求(JSON响应)?它是否正确?如果确实如此,有谁知道我在哪里可以看到这样的例子?如果没有,你能纠正我吗?谢谢!

android httprequest android-asynctask

11
推荐指数
1
解决办法
7万
查看次数

Android相机预览回调和mediarecorder录制视频

我想创建一个应用程序,它必须记录视频(使用媒体记录器)和录制的视频需要格式化(使用相机).
我创建了下面显示的示例代码,但是当从菜单按下startrecording按钮时显示错误.它显示强制关闭错误.但previewcallback没有错误.我的代码如下所示

  package buffer.video;
    import android.app.Activity;
    import android.os.Bundle;
    import java.io.IOException;  
    import android.app.Activity;
    import android.hardware.Camera;
    import android.hardware.Camera.PreviewCallback;
    import android.media.MediaRecorder;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.Menu;
    import android.view.MenuInflater;
    import android.view.MenuItem;
    import android.view.SurfaceHolder;
    import android.view.SurfaceView;
    import android.widget.Toast;

    public class VofoVideoToBufferActivity extends Activity implements SurfaceHolder.Callback,
    Camera.AutoFocusCallback {

    private SurfaceView preview;
    private SurfaceHolder previewHolder;

    private MediaRecorder mRecorder;
    private Camera mCamera;
    private boolean mPreviewRunning = false;
    private boolean mCaptureFrame = false;


    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.e("", "Begin onCreate");
    setContentView(R.layout.main);

    preview = (SurfaceView) findViewById(R.id.surfaceView1);
    previewHolder …
Run Code Online (Sandbox Code Playgroud)

android android-camera android-mediarecorder

10
推荐指数
1
解决办法
8223
查看次数

如何使用android ndk访问相机

android-NDK是否支持直接摄像头访问?我的NDK文件夹中没有Camera.h.

c++ android android-ndk android-camera

10
推荐指数
1
解决办法
2万
查看次数

上下文切换是否耗费了大量时间?

我一直遇到app(使用java和C++以及OpenCV)的问题,这似乎与执行各种任务所花费的时间非常不一致.为了帮助诊断这个,我在java(被调用one_off_speed_test())中创建了一个函数,它只需要一个循环中的一系列整数数学问题,大约需要半秒钟,然后打印到日志所需的时间.如果我从内部重复调用此函数,onCreate()则每次调用所用的时间非常一致(+ = 3%),但如果我从内部调用它onCameraFrame(),则OpenCV在从相机准备好图像时调用的函数,则每个框架中进行数学测试所花费的时间因任何因素而异.我决定在eclipse/DDMS中尝试执行采样器,看看我是否可以解决发生的事情.我看到当我点击one_off_speed_test()它时,它列出了该功能的父母和孩子,以及一行说" (上下文切换) ".然后在该行上,在标有" Incl Real Time " 的列下,它显示"66%".现在我对使用DDMS并不是很专业,而且我对上下文切换只有一个朦胧的想法,但是到目前为止的描述中,看起来我的上下文切换问题需要花费很多时间吗?或者我误解了DDMS输出.

在此输入图像描述

android profiling opencv android-ndk android-traceview

9
推荐指数
1
解决办法
1904
查看次数

Android如何处理多个实例数据/身份和JNI

这是一个良好实践和智能解决方案的问题,我需要一个建议.

我有一个应用程序(据我在Stackoverflow和Google搜索中可以阅读):

  • 该应用程序处理文档类型,我喜欢同时处理多个文档.(我习惯于Win32,其中有一个程序段和每个实例的一段数据,但在Android/Java中显然不是这样.)
  • 我看到一个实例从应用程序存储(平板电脑)启动应用程序,另一个打开带有附加文档文件的Gmail或电子邮件,第三个实例是通过从文件处理应用程序(如ES文件浏览器)打开文件.我喜欢他们都可以在两者之间翻转.用户可能希望一次读取多个文档.(如果我在Android/Java环境中使用错误的单词实例,请更正我)
  • 该应用程序内置于JNI部分,其中包含所有数据和逻辑以及Java Android用户界面.(JNI部分设​​计为独立于OS,用于不同操作系统中的实现,具有粘合c文件.)
  • 每次翻转屏幕或翻转实例时,Android部分都会重新创建
  • 只有一个JNI实例,即使重新创建Android Java部件并且所有Java数据都被清除,它仍然保留,现在它显示了在所有情况下翻转的最后一个读取文件推送正在运行的app按钮
  • 在JNI部分中创建不同的实例没有问题,只要可以将它们绑定到每个Java实例,使用身份或我可以用作与JNI部分交换的参数的东西,但是如何
  • 我无法在每个实例中保存FilePathName以识别Java部分中的实例,因为在重新创建Java部分时将擦除它.

第一个问题是,如果我在阅读Stackoverflow和Googled文章的观察中是对的吗?

第二个问题,解决问题的任何好建议?我需要一个建议

  • 只要它还活着,是否有可能在所有情况下识别实例?
  • 任何其他可能的路径,既包括为每个实例分隔数据的一般问题,也包括识别JNI处理每个实例的数据的实例?

java java-native-interface android

9
推荐指数
2
解决办法
400
查看次数

Android相机原生访问:startPreview()vs startRecording()

尝试从Android ICS中的本机代码开始使用相机:大多数手册都是指startPreview()方法.但是浏览AOSP代码我发现了' startRecording() '方法<Camera.h>.这里说它来自接口ICameraRecordingProxy" 允许录音机在录音期间接收视频帧 "

所以问题是 - 在性能方面,'startRecording'方法比'startPreview'更有效吗?

进入本机代码的唯一目标是性能,Java'Camera'太慢,OpenCV也不提供所需的FPS级别.

编辑:目标平台是:API级别= 17,设备Allwinner A31开发板,1280x720x30FPS.任务是从相机捕获帧,修改它们,编码(H264)并存储到SD卡.纯java MediaRecorder用1280x720x30写入mp4文件.不需要在屏幕上显示实时预览.

本机模式下的OpenCV-demo1提供1920x1080x2(在java模式下相同).具有空PreviewCallback最大FPS的简单Java方法是15.

先感谢您..

camera android android-ndk

8
推荐指数
1
解决办法
6724
查看次数

无法使用Android Studio从JNI打印日志消息

我得到的错误:

错误:对'__android_log_print'的未定义引用

我已将此行添加到我的.cpp文件中:

#include <android/log.h>
Run Code Online (Sandbox Code Playgroud)

我尝试过两种方法:__ android_log_print__android_log_write

我还在我的Android.mk文件(我手动编译)中链接了日志库.

LOCAL_LDLIBS:= --llog

我也尝试了几种我认为的替代品:

LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog 
Run Code Online (Sandbox Code Playgroud)

这是我的Android.mk:

LOCAL_PATH := $(call my-dir)

#used to skip re-compiling libraw
#include $(CLEAR_VARS)
#LOCAL_MODULE    := libraw_r
#LOCAL_SRC_FILES := ../obj/local/armeabi/libraw_r.so
#LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/libraw
#include $(PREBUILT_SHARED_LIBRARY)

#used for compiling libraw
include $(CLEAR_VARS)
LOCAL_CFLAGS += -I$(SYSROOT)/usr/lib/include/libraw -pthread -w
LOCAL_CXXFLAGS += -I$(SYSROOT)/usr/lib/include/libraw -pthread -w
LOCAL_MODULE     := libraw_r                    # name of your module
LOCAL_LDLIBS     += -L$(SYSROOT)/usr/lib -lstdc++ # libraries to link against, lstdc++ is auto-linked

LOCAL_SRC_FILES  :=  internal/dcraw_common.cpp …
Run Code Online (Sandbox Code Playgroud)

java-native-interface android-ndk android-studio android-gradle-plugin

8
推荐指数
1
解决办法
9332
查看次数

Swift 5 中的引用赋值是原子的吗?

在这种情况下我需要某种显式同步吗?

class A { 
  let val: Int; 
  init(_ newVal: Int) { 
    val = newVal
   }
}

public class B {
  var a: A? = nil
  public func setA() { a = A(0) }
  public func hasA() -> Bool { return a != nil }
}
Run Code Online (Sandbox Code Playgroud)

B类中还有另一种方法:

public func resetA() {
  guard hasA() else { return }
  a = A(1)
}
Run Code Online (Sandbox Code Playgroud)

setA()并且resetA()可以从任何线程以任何顺序调用。

我知道可能存在竞争条件,如果同时一个线程调用setA()和另一个线程调用resetA(),则结果无法确定:val要么是0,要么是1,但我不在乎:无论如何,hasA()将返回 true,won'它吗?

如果 …

thread-safety swift ios-multithreading

8
推荐指数
1
解决办法
201
查看次数