我正在制作一个可以显示视频的动态壁纸.一开始我认为这将非常困难,所以有些人建议使用OpenGL解决方案或其他非常复杂的解决方案(例如这个).
无论如何,为此,我发现了各种各样的地方,并且基于这个github库(它有一些bug),我终于得到了它的工作.
虽然我成功地显示了一个视频,但我无法找到控制它与屏幕分辨率相比如何显示的方法.
目前它总是被拉伸到屏幕尺寸,这意味着这个(从这里拍摄的视频):
得到如下:
原因是不同的宽高比:560x320(视频分辨率)与1080x1920(设备分辨率).
注意:我很清楚缩放视频的解决方案,这些解决方案可以在各种Github存储库中找到(例如这里),但我问的是一个动态壁纸.因此,它没有View,所以它对如何做事更加有限.更具体地说,解决方案不能具有任何类型的布局,TextureView或SurfaceView或任何其他类型的View.
我尝试使用SurfaceHolder的各种领域和功能,但到目前为止没有运气.例子:
setVideoScalingMode - 它要么崩溃要么不做任何事情.
改变surfaceFrame - 相同.
这是我目前的代码(这里有完整的项目):
class MovieLiveWallpaperService : WallpaperService() {
override fun onCreateEngine(): WallpaperService.Engine {
return VideoLiveWallpaperEngine()
}
private enum class PlayerState {
NONE, PREPARING, READY, PLAYING
}
inner class VideoLiveWallpaperEngine : WallpaperService.Engine() {
private var mp: MediaPlayer? = null
private var playerState: PlayerState = PlayerState.NONE
override fun onSurfaceCreated(holder: SurfaceHolder) {
super.onSurfaceCreated(holder)
Log.d("AppLog", "onSurfaceCreated")
mp = …Run Code Online (Sandbox Code Playgroud) 安装支持Android 4.4(KitKat)的新ADT(22.3.0.v201310242005-887826)后,我不断收到错误,如下所示:

发生了一个内部的错误
在错误列表中,我看到多个"RenderPreview"项,当我点击其中任何一个时,我看到:
发生内部错误.场景创建后,必须调用#init()
在另一台计算机上测试新的ADT时,我看不到出现此错误.这很奇怪.
为什么我会收到这些错误,我该怎么做才能解决?
我在设计偏好屏幕时遇到了非常奇怪的问题.虽然我没有给出任何布局余量,但是左边留有一些空间.
如下图所示:

XML:
<PreferenceScreen android:title="demo" >
<CheckBoxPreference
android:defaultValue="false"
android:key="prefSync"`
android:title="Auto Sync" />
</PreferenceScreen>
Run Code Online (Sandbox Code Playgroud)
我在屏幕上添加复选框首选项时做错了什么?
假设我有下一个文本:
你好stackOverflow
我希望将第二个单词设置为RelativeSizeSpan(设置相对字体大小)和TextAppearanceSpan(设置文本的颜色),如何将它们合并?
我所知道的是我可以选择其中一个,例如使用下一个代码:
final SpannableString textToShow = new SpannableString("Hello stackOverflow");
textToShow.setSpan(new RelativeSizeSpan(1.5f), textToShow.length() - "stackOverflow".length(),textToShow.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(textToShow);
Run Code Online (Sandbox Code Playgroud)
但我还需要设置颜色,甚至添加其他跨越类的其他功能......
我能做什么 ?
谷歌已弃用getRecentTasks"ActivityManager"类的功能" ".现在它所做的只是获取当前应用程序已打开的应用程序列表.
我甚至在StackOverflow上写了一篇关于它的帖子,但我发现这是不可能的.
我发了一篇关于它的帖子(在这里,另一个,类似的由其他人创建,在这里),并要求重新考虑它,谷歌决定创建一个新类,似乎提供类似的功能(更像是统计,但也可能有用),但我无法找到如何使用它.
该类称为" UsageStatsManager",我的猜测是函数" queryUsageStats"完成工作.
此外,它似乎有一个新的权限(" android.permission.PACKAGE_USAGE_STATS"),这是一个系统权限,但它写道:
声明权限意味着使用API的意图,设备用户可以通过Settings应用程序授予权限.
我查看了Android的代码,并注意到"Context"有USAGE_STATS_SERVICE,在JavaDocs中说下一件事:
/**
* Use with {@link #getSystemService} to retrieve a {@link
* android.app.UsageStatsManager} for interacting with the status bar.
*
* @see #getSystemService
* @see android.app.UsageStatsManager
* @hide
*/
public static final String USAGE_STATS_SERVICE = "usagestats";
Run Code Online (Sandbox Code Playgroud)
奇怪的是,不仅它说" status bar",而且packageName也不匹配(应该是" android.app.usage.UsageStatsManager").
我还添加了正确的权限:
<uses-permission
android:name="android.permission.PACKAGE_USAGE_STATS"
tools:ignore="ProtectedPermissions" />
Run Code Online (Sandbox Code Playgroud)
这是我使用的代码:
final UsageStatsManager …Run Code Online (Sandbox Code Playgroud) android usage-statistics activity-manager android-recents usagestatsmanager
我最近将我的应用迁移到Android-Studio.我有一些问题,但最终我克服了它们.
出于某种原因,在Android Studio上,当我尝试签署APK时,我收到很多错误,如下所示:
Error:(16) Error: "..." is not translated in "de" (German), "el" (Greek), "iw" (Hebrew) [MissingTranslation]
Run Code Online (Sandbox Code Playgroud)
(其中"......"是一个字符串)
在底部,经过这种很多错误,我看到了这个:
Error:Execution failed for task ':app:lintVitalRelease'.
> Lint found fatal errors while assembling a release target.
To proceed, either fix the issues identified by lint, or modify your build script as follows:
...
android {
lintOptions {
checkReleaseBuilds false
// Or, if you prefer, you can continue to check for errors in release builds,
// but continue the …Run Code Online (Sandbox Code Playgroud) 我的应用程序(在此处)可以在整个文件系统(不仅是已安装的应用程序)中搜索APK文件,显示有关每个文件的信息,允许删除,共享,安装...
作为Android Q范围内存储功能的一部分,Google宣布SAF(存储访问框架)将取代常规存储权限。这意味着,即使您尝试使用存储权限,也只会授予访问特定类型的文件的权限,以使File和file-path可以使用或完全沙箱化(在此处撰写)。
这意味着许多框架将需要依赖SAF而不是File和file-path。
其中之一是packageManager.getPackageArchiveInfo,它给出了文件路径,返回 PackageInfo,我可以得到有关以下内容的各种信息:
packageInfo.applicationInfo.loadLabel(packageManager)。这基于设备的当前配置(语言环境等)。packageInfo.packageNamepackageInfo.versionCode或packageInfo.longVersionCode。packageInfo.versionName一种。 BitmapFactory.decodeResource(packageManager.getResourcesForApplication(applicationInfo),packageInfo.applicationInfo.icon, bitmapOptions)
b。如果已安装,AppCompatResources.getDrawable(createPackageContext(packageInfo.packageName, 0), packageInfo.applicationInfo.icon )
C。 ResourcesCompat.getDrawable(packageManager.getResourcesForApplication(applicationInfo), packageInfo.applicationInfo.icon, null)
它还有很多其他功能,它们可以返回您,还有很多可选功能,但我认为这些是有关APK文件的基本详细信息。
我希望Google可以为此提供一个很好的替代方法(在此和此处要求),因为目前我找不到任何好的解决方案。
使用从SAF获得的Uri并从中获得InputStream很容易:
@TargetApi(Build.VERSION_CODES.O)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
setSupportActionBar(toolbar)
packageInstaller = packageManager.packageInstaller
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT)
intent.addCategory(Intent.CATEGORY_OPENABLE)
intent.type = "application/vnd.android.package-archive"
startActivityForResult(intent, 1)
}
override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) { …Run Code Online (Sandbox Code Playgroud) android inputstream apk android-package-managers scoped-storage
谷歌已经宣布了一种名为" ConstraintLayout " 的新布局,它应该是最终布局,可以在保持平坦(没有嵌套布局)的同时取代所有布局,并且具有更好的性能.
事情是,我几乎没有看到任何可以帮助我解决这个问题的教程,除了在Google IO上展示的视频.
我想要做的是,假设我在另一个布局中有一个垂直居中的LinearLayout - 将它们转换为单个ConstraintLayout.
毕竟,这是这个新布局的目的......
我想要处理的布局如下:
请注意,中心的视图仅垂直居中,并且2个textView位于ImageView的右侧,ImageView也垂直居中.
这一切都适用于RelativeLayout,它具有2个TextViews的LinearLayout,但我想知道如何将它们转换为单个ConstraintLayout.
这是我展示的示例XML:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?attr/listPreferredItemHeightSmall">
<ImageView
android:id="@+id/appIconImageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_centerVertical="true"
android:layout_marginEnd="4dp"
android:layout_marginLeft="2dp"
android:layout_marginRight="4dp"
android:layout_marginStart="2dp"
android:adjustViewBounds="true"
android:src="@android:drawable/sym_def_app_icon"
tools:ignore="ContentDescription"/>
<LinearLayout
android:id="@+id/appDetailsContainer"
android:layout_width="0px"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toEndOf="@+id/appIconImageView"
android:layout_toLeftOf="@+id/overflowView"
android:layout_toRightOf="@+id/appIconImageView"
android:layout_toStartOf="@+id/overflowView"
android:orientation="vertical">
<TextView
android:id="@+id/appLabelTextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:text="label"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textDirection="locale"
tools:ignore="HardcodedText,UnusedAttribute"/>
<TextView
android:id="@+id/appDescriptionTextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:minLines="3"
android:text="description"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textDirection="locale"
tools:ignore="HardcodedText,UnusedAttribute"/>
</LinearLayout>
<ImageView
android:id="@+id/overflowView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:adjustViewBounds="true"
android:background="?attr/selectableItemBackground"
android:clickable="true" …Run Code Online (Sandbox Code Playgroud) Android在如何处理SD卡和存储方面有很多变化:
从API 23(Android 6)开始,事情似乎再次发生变化......
对于API 23,至少有两件新东西与存储相关:
由于没有配备SD卡的Android 6设备,并且因为模拟器本身并不能真正使用SD卡,所以仍然无法知道发生了什么.
SD卡是否可以使用File-API而不是DocumentFile获取访问权限?
如果我想访问所有外部存储路径(包括SD卡),这是否意味着我需要两次请求此权限:一个用于主外部存储,一个用于SD卡?
在手动授予许可之前,SD卡上的文件是否可以以任何方式访问?
假设用户选择使用"Adoptable Storage Devices",这对于检索应用程序文件路径的各种函数意味着什么?例如:getFilesDir,getExternalFilesDir,...?getExternalFilesDirs的oder会因为它而改变吗?
当用户将应用程序从SD卡移动到SD卡时(使用"可采用的存储设备"),应用程序的文件会发生什么变化?SD卡上的应用程序文件怎么样?他们会留下来吗?或者他们会搬到某个地方?
例如,如果应用程序在SD卡上有"file1.txt",则在路径"/ storage/extSdCard/Android/data/appPackageName"上,它有一个文件"file2.txt"(或者甚至是同一个名字)在路径"/ storage/emulated/0/Android/data/appPackageName"上的主外部存储上.切换后,这些文件会发生什么?如果有的话,他们将如何合并到一个文件夹中?
将应用程序移动到SD卡(使用"Adoptable Storage Devices")时,是否意味着不会使用内部存储?
android sd-card android-permissions android-external-storage android-6.0-marshmallow
大多数时候,在Android上获取OOM是由于使用了太多位图和/或创建大位图.
最近我决定试用JNI,以便通过将数据本身存储在JNI端来避免OOM.
在与JNI搞砸了一段时间后,我在SO上创建了一些帖子,寻求帮助并分享我的知识,现在我决定与你分享更多代码.如果有人有兴趣阅读调查结果或做出贡献,这里有帖子:
这一次,我添加了存储,恢复,裁剪和旋转位图的功能.它应该很容易添加更多选项,如果其他人在这里将自己的代码添加到更有用的功能,我会很高兴.
所以我要展示的代码实际上是合并了我创造的所有东西.
Bitmap bitmap=BitmapFactory.decodeResource(getResources(),R.drawable.ic_launcher);
final int width=bitmap.getWidth(),height=bitmap.getHeight();
// store the bitmap in the JNI "world"
final JniBitmapHolder bitmapHolder=new JniBitmapHolder(bitmap);
// no need for the bitmap on the java "world", since the operations are done on the JNI "world"
bitmap.recycle();
// crop a center square from the bitmap, from (0.25,0.25) to (0.75,0.75) of the bitmap.
bitmapHolder.cropBitmap(width/4,height/4,width*3/4,height*3/4);
//rotate the bitmap:
bitmapHolder.rotateBitmapCcw90();
//get the output java bitmap , …Run Code Online (Sandbox Code Playgroud) java-native-interface android bitmap out-of-memory android-ndk
android ×10
apk ×2
adt ×1
android-ndk ×1
bitmap ×1
eclipse ×1
font-size ×1
gui-designer ×1
inputstream ×1
preference ×1
sd-card ×1
translation ×1