小编and*_*per的帖子

如何在动态壁纸,中心裁剪和适合宽度/高度适合视频?

背景

我正在制作一个可以显示视频的动态壁纸.一开始我认为这将非常困难,所以有些人建议使用OpenGL解决方案或其他非常复杂的解决方案(例如这个).

无论如何,为此,我发现了各种各样的地方,并且基于这个github库(它有一些bug),我终于得到了它的工作.

问题

虽然我成功地显示了一个视频,但我无法找到控制它与屏幕分辨率相比如何显示的方法.

目前它总是被拉伸到屏幕尺寸,这意味着这个(从这里拍摄的视频):

在此输入图像描述

得到如下:

在此输入图像描述

原因是不同的宽高比:560x320(视频分辨率)与1080x1920(设备分辨率).

注意:我很清楚缩放视频的解决方案,这些解决方案可以在各种Github存储库中找到(例如这里),但我问的是一个动态壁纸.因此,它没有View,所以它对如何做事更加有限.更具体地说,解决方案不能具有任何类型的布局,TextureView或SurfaceView或任何其他类型的View.

我试过的

我尝试使用SurfaceHolder的各种领域和功能,但到目前为止没有运气.例子:

这是我目前的代码(这里有完整的项目):

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 live-wallpaper android-mediaplayer

61
推荐指数
2
解决办法
2948
查看次数

ADT 22.3(android 4.4) - 获取错误"在场景创建之后,必须调用#init()"

安装支持Android 4.4(KitKat)的新ADT(22.3.0.v201310242005-887826)后,我不断收到错误,如下所示:

在此输入图像描述

发生了一个内部的错误

在错误列表中,我看到多个"RenderPreview"项,当我点击其中任何一个时,我看到:

发生内部错误.场景创建后,必须调用#init()

在另一台计算机上测试新的ADT时,我看不到出现此错误.这很奇怪.

为什么我会收到这些错误,我该怎么做才能解决?

eclipse android gui-designer adt android-4.4-kitkat

57
推荐指数
3
解决办法
7079
查看次数

Android:如何删除首选项屏幕中的边距/填充

我在设计偏好屏幕时遇到了非常奇怪的问题.虽然我没有给出任何布局余量,但是左边留有一些空间.

如下图所示: 在此输入图像描述

XML:

   <PreferenceScreen android:title="demo" >
       <CheckBoxPreference
           android:defaultValue="false"
            android:key="prefSync"`
            android:title="Auto Sync" />
    </PreferenceScreen>
Run Code Online (Sandbox Code Playgroud)

我在屏幕上添加复选框首选项时做错了什么?

android preference checkboxpreference

55
推荐指数
7
解决办法
2万
查看次数

如何在同一部分文本上的TextView文本上设置多个跨度?

假设我有下一个文本:

你好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)

但我还需要设置颜色,甚至添加其他跨越类的其他功能......

我能做什么 ?

android font-size spannablestring

54
推荐指数
3
解决办法
5万
查看次数

如何使用UsageStatsManager?

背景

谷歌已弃用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

52
推荐指数
5
解决办法
5万
查看次数

如何使用非翻译字符串在Android Studio上签名APK?

背景

我最近将我的应用迁移到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)

android translation apk android-studio

52
推荐指数
3
解决办法
3万
查看次数

如何在不使用文件或文件路径的情况下获取文件系统(不仅仅是已安装的文件)中APK文件的信息?

背景

我的应用程序(在此处)可以在整个文件系统(不仅是已安装的应用程序)中搜索APK文件,显示有关每个文件的信息,允许删除,共享,安装...

作为Android Q范围内存储功能的一部分,Google宣布SAF(存储访问框架)将取代常规存储权限。这意味着,即使您尝试使用存储权限,也只会授予访问特定类型的文件的权限,以使File和file-path可以使用或完全沙箱化(在此处撰写)。

这意味着许多框架将需要依赖SAF而不是File和file-path。

问题

其中之一是packageManager.getPackageArchiveInfo,它给出了文件路径,返回 PackageInfo,我可以得到有关以下内容的各种信息:

  1. 名称(在当前配置上),使用,也称为“标签” packageInfo.applicationInfo.loadLabel(packageManager)。这基于设备的当前配置(语言环境等)。
  2. 包名称,使用 packageInfo.packageName
  3. 版本代码,使用packageInfo.versionCodepackageInfo.longVersionCode
  4. 版本号,使用 packageInfo.versionName
  5. 应用图标,根据当前配置(密度等...)以各种方式使用:

一种。 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

51
推荐指数
2
解决办法
1519
查看次数

如何使用ConstraintLayout将多个视图集中在一起?

背景

谷歌已经宣布了一种名为" 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 android-layout android-constraintlayout

49
推荐指数
4
解决办法
5万
查看次数

Android 6上的存储访问如何变化?

背景

Android在如何处理SD卡和存储方面有很多变化:

  • API 3 - 您获得所有访问权限,无需权限
  • API 4-15 - 您需要使用WRITE_EXTERNAL_STORAGE,并获得所有访问权限.
  • API 16-18 - 如果您只想阅读,请使用READ_EXTERNAL_STORAGE
  • API 19-20 - 您无法读取或写入辅助外部存储(SD卡),除非您的应用程序是系统应用程序,或者您拥有root用户.
  • API 21-22 - 为了访问SD卡,您需要请求用户许可,并使用DocumentFile API而不是File API.正如我在这里,这里这里所写的那样,这引发了许多问题.

从API 23(Android 6)开始,事情似乎再次发生变化......

问题

对于API 23,至少有两件新东西与存储相关:

  • " 可采用的存储设备 " - 用户可以选择将SD卡作为主要外部存储器.
  • 作为新权限机制(在运行时请求权限)的一部分,存储似乎也是用户需要确认的权限.这适用于READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE

由于没有配备SD卡的Android 6设备,并且因为模拟器本身并不能真正使用SD卡,所以仍然无法知道发生了什么.

问题

  1. SD卡是否可以使用File-API而不是DocumentFile获取访问权限?

  2. 如果我想访问所有外部存储路径(包括SD卡),这是否意味着我需要两次请求此权限:一个用于主外部存储,一个用于SD卡?

  3. 在手动授予许可之前,SD卡上的文件是否可以以任何方式访问?

  4. 假设用户选择使用"Adoptable Storage Devices",这对于检索应用程序文件路径的各种函数意味着什么?例如:getFilesDir,getExternalFilesDir,...?getExternalFilesDirs的oder会因为它而改变吗?

  5. 当用户将应用程序从SD卡移动到SD卡时(使用"可采用的存储设备"),应用程序的文件会发生什么变化?SD卡上的应用程序文件怎么样?他们会留下来吗?或者他们会搬到某个地方?

    例如,如果应用程序在SD卡上有"file1.txt",则在路径"/ storage/extSdCard/Android/data/appPackageName"上,它有一个文件"file2.txt"(或者甚至是同一个名字)在路径"/ storage/emulated/0/Android/data/appPackageName"上的主外部存储上.切换后,这些文件会发生什么?如果有的话,他们将如何合并到一个文件夹中?

  6. 将应用程序移动到SD卡(使用"Adoptable Storage Devices")时,是否意味着不会使用内部存储?

android sd-card android-permissions android-external-storage android-6.0-marshmallow

47
推荐指数
1
解决办法
3万
查看次数

如何在使用大图像时使用JNI位图操作来帮助避免OOM?

背景

大多数时候,在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

46
推荐指数
1
解决办法
3万
查看次数