我想播放一些音频,音量级别调整为耳朵的大小。“通话模式”。为此,我使用众所周知且普遍建议的
audioManager.setMode(audioNormalState ?
AudioManager.MODE_NORMAL : AudioManager.MODE_IN_COMMUNICATION);
Run Code Online (Sandbox Code Playgroud)
问题是我并不总是在模式切换后播放音频,我必须等待并且不确定多久,甚至可能是几分钟。我做了一些循环记录,MODE_IN_COMMUNICATION只要用户在某些搭载 Android 9 的摩托罗拉上的应用程序中处于“电话通话模式”,模式就会保留,但在配备Android 12 的 Pixel 3 上,6 秒后模式会自动切换回MODE_NORMAL当没有播放任何内容时。没有执行额外的代码(如某些侦听器),没有额外的(系统)日志。当我在切换到MODE_IN_COMMUNICATION模式后 1 秒开始播放音频时,只要播放音频(甚至超过 6 秒),它就不会自动切换,但在完成模式后也会自动切换到MODE_NORMAL.
我的应用程序可以发出某种实时语音呼叫(命令),但也可以“发出蜂鸣声”一些信号模式,并且还有一个历史记录功能,可以按时间顺序再次播放所有发声动作。如果这只是语音,那么MODE_IN_COMMUNICATION仅在通话期间切换到和返回可能就足够了,但是如何处理非常重要的SoundPool广告歌曲,我是否也必须为它们切换模式?(或者对于历史播放,这是一个混合)据我所知模式切换并不快(在某些设备上甚至是几秒),所以我可能会对数百毫秒的短信号应用一些显着的延迟(没办法,每个毫秒都是至关重要!)或者即使在“电话呼叫模式”下,当模式没有“足够快”改变时(用户不会高兴),我也冒着大声播放信号/语音的风险。我依赖于固定设置(但根据应用程序状态和设置进行配置)MODE_IN_COMMUNICATION,该设置一直有效到 Android 12...(可以确认 Pixel 和 Samsung 上的新/错误行为)
目前使用的切换音频模式+配置的方法如下,值得注意的是,该setSpeakerphoneOn方法在 Android 12 上也并不总是有效。至少在打开时不起作用MODE_NORMAL,这是现在默认的自动切换回模式,也是isSpeakerphoneOn第false一个开始,但我所有的音频源实际上都大声播放......
// forceAudioNormalState = true only when app exit!
public static void resolveLoudState(AudioManager audioManager, boolean forceAudioNormalState) {
boolean silentPhoneCallMode = isPhoneCallModeEnabled(); // phone call GUI, only …Run Code Online (Sandbox Code Playgroud) 我已经在我的应用程序中实现了 Firebase,我正在发送带有额外数据的推送。当我的应用程序处于前台时,我正在正确处理数据并显示我自己的通知,但我在获取数据时遇到问题,当应用程序“归位”(未终止)时 Firebase 会“自动”显示通知。根据DOCS Activity应该得到新Intent的附加值满足我的价值观,而不是应用程序回到前面,恢复旧状态。
设想:
Notification无需调用onMessageReceived(根据文档中的表格,它应该?)Intent使用用于打开Activity顶部的“原始”附加功能来实现我有登录onCreate, onNewIntent, onResume( Activity) 和onMessageReceived( Service), onlyonResume被调用,其中我正在打印如下附加内容:
if (getIntent().getExtras() != null) {
for (String key : getIntent().getExtras().keySet()) {
Object value = getIntent().getExtras().get(key);
Log.d("Activity onResume", "Key: " + key + " Value: " + value);
}
}
Run Code Online (Sandbox Code Playgroud) android push-notification firebase firebase-cloud-messaging android-push-notification
我有一个带有此最新声明的应用程序:
compileSdkVersion 29
buildToolsVersion '29.0.2'
useLibrary 'org.apache.http.legacy'
defaultConfig {
minSdkVersion 19
targetSdkVersion 29
...
Run Code Online (Sandbox Code Playgroud)
而且我WebView在应用程序中几乎没有s - 全尺寸Activity,Fragment版本以及固定尺寸的广告(比如 300x300dp,水平居中)View放置在带有本机小部件的列表中。目标更新后,最后一个不再加载(只有这个,所有其他都在工作),但是当我在线更改(恢复)时:
targetSdkVersion 28
Run Code Online (Sandbox Code Playgroud)
它和更新前一样工作。WebView此广告的整个设置如下所示:
webView = findViewById(R.id.ad_banner_webview);
webView.setLayerType(Build.VERSION.SDK_INT <= 19 ?
WebView.LAYER_TYPE_SOFTWARE : // on older devices non-fullactivity webview is blinking/glitching
WebView.LAYER_TYPE_HARDWARE, null);
webView.setBackgroundColor(Color.TRANSPARENT);
final String userAgent = AppInfo.getInstance(webView.getContext()).getUserAgent();
webView.getSettings().setUserAgentString(userAgent);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setLoadWithOverviewMode(true);
webView.getSettings().setDomStorageEnabled(true);
webView.getSettings().setTextZoom(100);
webView.getSettings().setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
webView.setVerticalScrollBarEnabled(false);
webView.setHorizontalScrollBarEnabled(false);
webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
webView.setWebChromeClient(new WebChromeClient());
webView.setWebViewClient(new CustomWebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url); …Run Code Online (Sandbox Code Playgroud) 今天我在我所有的片段中发现了这个警告:
警告:(45, 12) 'onCreateView' 总是返回非空类型
onCreateView:
override fun onCreateView(inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?): View? {
...
}
Run Code Online (Sandbox Code Playgroud)
问题是,发生了什么变化,为什么?
Android Studio 版本 - 4.1.1。
我正在寻找有效的方法来减少一些视频权重(作为File上传),明显的答案是:让我们降低分辨率!(全高清或4K不需要,简单的高清对我来说已经足够了)我已经尝试了很多方法应该通过很多API(需要10),最好的方法是使用android-ffmpeg-java,但是...我的漂亮快速几乎当前的旗舰设备整个过程持续约length_of_video*4秒,此lib的重量是9 Mb,这个数量增加了我的应用程序大小...没有wai!(12 Mb到1 Mb是很好的结果,但仍然有太多的缺陷)
所以我决定使用原生的Android方式来实现这一点,MediaMuxer并且MediaCodec- 它们分别来自API18和API16(旧设备用户:抱歉;但他们也经常使用"低分辨率"相机).下面的方法几乎可以工作 - MediaMuxer不尊重MediaFormat.KEY_WIDTH和MediaFormat.KEY_HEIGHT- 提取File是"重新压缩",重量稍微小一点,但分辨率与原始视频相同File...
那么,问题:如何使用MediaMuxer和其他随附的类和方法压缩和重新调整/更改视频的分辨率?
public File getCompressedFile(String videoPath) throws IOException{
MediaExtractor extractor = new MediaExtractor();
extractor.setDataSource(videoPath);
int trackCount = extractor.getTrackCount();
String filePath = videoPath.substring(0, videoPath.lastIndexOf(File.separator));
String[] splitByDot = videoPath.split("\\.");
String ext="";
if(splitByDot!=null && splitByDot.length>1)
ext = splitByDot[splitByDot.length-1];
String fileName = videoPath.substring(videoPath.lastIndexOf(File.separator)+1,
videoPath.length());
if(ext.length()>0)
fileName=fileName.replace("."+ext, "_out."+ext);
else
fileName=fileName.concat("_out");
final File outFile = new File(filePath, …Run Code Online (Sandbox Code Playgroud) 我在Google Play中有一个应用程序,它是使用工具和API构建的.一切都运行良好,但最后一次更新API 23(工具23.1)显示Android 6.0错误的用户编号为"-505"(在Google Play应用中或在通知).但它真的随机...我知道两个相同的设备 - Nexus 5与6.0.1 - 一个有-505,第二个是安装更新没有问题....
经过大量搜索后,我发现这个错误意味着重复许可的信息,但是......?
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- GCM -->
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<permission
android:name="com.dummy.mobile.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name="com.dummy.mobile.permission.C2D_MESSAGE" />
<android:uses-permission
android:name="android.permission.READ_PHONE_STATE" />
<android:uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<android:uses-permission
android:name="android.permission.READ_EXTERNAL_STORAGE" />
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
我在我的应用程序中使用facebook登录.一旦用户登录,我就可以获得他们的基本Facebook信息,例如显示名称,电子邮件和照片网址.我想得到他们的facebook好友列表.我想我可以"直接"使用firebase,但我不记得我怎么也找不到任何关于它的信息.我想当人们使用facebook登录时,我首先要告诉Firebase获取好友列表,然后我可以使用firebaseAuth.getCurrentUser().getFriendList()这样的方法来获取它.
你知道怎么用firebaseAuth获取facebook好友列表吗?
谢谢,
亚历克斯
android facebook-graph-api firebase facebook-friends firebase-authentication
我有一个应用程序(已经发布),我已经开发了振动的新功能.所以我添加了新的权限:
<uses-permission
android:name="android.permission.VIBRATE" />
Run Code Online (Sandbox Code Playgroud)
发布更新后我注意到我的Nexus 7 2013没有得到更新,可能是因为这个设备根本就没有Vibrator ...所以在下一个版本中我已经将上面的行更改为
<uses-feature
android:name="android.permission.VIBRATE"
android:required="false"/>
Run Code Online (Sandbox Code Playgroud)
这可能是正确的...然后我的Nexus成功更新了.但现在我在设备4.0-4.3上偶尔会看到崩溃
致命异常:java.lang.SecurityException需要VIBRATE权限
据我所知,line android:required仅适用于uses-feature而不适用于uses-permission,因此问题是:如何声明VIBRATE允许安装在无振动设备上的适当权限,以及避免SecurityException使用旧的,不幸的仍然受支持的设备?
PS.目前我认为正确的烫发声明应该如下所示,但我不想在生产环境上"测试"声明.任何人都可以确认吗?
<uses-permission
android:name="android.permission.VIBRATE"
android:maxSdkVersion="18" />
Run Code Online (Sandbox Code Playgroud)
基于新设备上的碰撞和仍然工作的振动,即使可能不适合VIBRATOR uses-feature声明(因此目前没有许可).也许既然KitKat没有必要像在SD上写一样来声明振动烫发?我在文档中找不到任何相关内容...另外:上述声明存在于维基百科官方应用程序中
编辑 - 更复杂的信息:引入数量100 uses-permission,Nexus 7没有得到更新.一周后101发布没有任何清单更改(除了版本号ofc)和与此新功能相关的代码(其他组件中的错误修正),Nexus仍然没有更新.下周和rel 102,没有变化.然后我改为uses-feature103并且Nexus在同一天得到更新...并且因为这个版本崩溃开始发生在4.0-4.3
我正在我的应用程序中使用画中画模式。事实上,它工作得很好,但我在瞬间闪烁/消失视频时遇到了问题。
我在“全屏”/正常模式下有 VideoActivity。我正在打电话enterPictureInPictureMode();并且Activity正在崩溃到小的画中画帧。在动画结束缩小布局的那一刻,视频会在一瞬间/一帧内变得透明。同样在这个框架中,整个画中画框架在(高度)下都有阴影。当我触摸这个小画中画帧时,它会扩展到大画中画帧(不是全屏)并且这个动画很流畅,但是当自动折叠到小画中画帧时它会在最后再次闪烁......每次Activity动画时到小画中画帧(无论是从大画中画帧还是全屏折叠Activity),当达到最终“小边界”时,会发生一帧透明闪烁。对声音无影响,视频播放稳定,无来电onPlayerStateChanged。
使用较新的 API 版本,我们可以创建有边界的动画,这就是我知道视频视图正在闪烁的方式......使用无属性方法使整个布局折叠,我只能在视频/播放器/表面视图(黑色条纹)区域看到闪烁上面和下面的视频)。当我使用较新的方法时,setSourceRectHint我可以看到整个画中画帧消失,而不考虑其父级的黑色背景。实际上,我添加了View具有固定大小、背景颜色centerInParent等的虚拟对象PlayerView- 当放置在(父级中的第一个)PlayerView层下方时,它会像玩家一样闪烁/隐藏,但放置在上方根本不闪烁,PlayerView即使在它上方显示消失一秒。
如何修复闪烁或设置黑色背景,而不是透明...
if (Build.VERSION.SDK_INT >= 26) {
Rect bounds = new Rect();
playerView.getVideoSurfaceView().getDrawingRect(bounds);
int toTop = (playerView.getMeasuredHeight() - bounds.height()) / 2,
toLeft = (playerView.getMeasuredWidth() - bounds.width()) / 2;
bounds.top += toTop;
bounds.left += toLeft;
bounds.bottom += toTop;
bounds.right += toLeft;
enterPictureInPictureMode(new PictureInPictureParams.Builder(). …Run Code Online (Sandbox Code Playgroud) android android-videoview exoplayer android-picture-in-picture
我正在接收一些 RTP 流,我只知道每个数据包的 AMR-WB 八位字节对齐 100 毫秒。某些第 3 方可以接收相同的流及其“可听”,因此这是正确的。现在我正在接收这些数据并尝试解码,但没有运气......
在里面:
val sampleRate = 16000
val mc = MediaCodec.createDecoderByType(MediaFormat.MIMETYPE_AUDIO_AMR_WB)
val mf = MediaFormat.createAudioFormat(MediaFormat.MIMETYPE_AUDIO_AMR_WB, sampleRate, 1)
mf.setInteger(MediaFormat.KEY_SAMPLE_RATE, sampleRate) // is it needed?
mc.configure(mf, null, null, 0)
mc.start()
Run Code Online (Sandbox Code Playgroud)
分别解码每个数据包:
private fun decode(decoder: MediaCodec, mediaFormat: MediaFormat, rtpPacket: RtpPacket): ByteArray {
var outputBuffer: ByteBuffer
var outputBufferIndex: Int
val inputBuffers: Array<ByteBuffer> = decoder.inputBuffers
var outputBuffers: Array<ByteBuffer> = decoder.outputBuffers
// input
val inputBufferIndex = decoder.dequeueInputBuffer(-1L)
if (inputBufferIndex >= 0) {
val inputBuffer = inputBuffers[inputBufferIndex]
inputBuffer.clear()
inputBuffer.put(rtpPacket.payload)
// …Run Code Online (Sandbox Code Playgroud) android ×10
firebase ×2
android-10.0 ×1
android-12 ×1
exoplayer ×1
google-play ×1
kotlin ×1
mediacodec ×1
mediamuxer ×1
video ×1
webview ×1