小编New*_*Guy的帖子

下载管理器不适用于 Android 10 (Q)

很长一段时间以来,我一直在努力解决这个问题……我正在更新一个应用程序,该应用程序使用 DownloadManger 来执行一个简单的任务,例如将文件下载到外部存储公共目录,即:

Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
Run Code Online (Sandbox Code Playgroud)

从 Android api 19-28 开始,这里一切正常。在 API 29 (Q/10) 上进行测试时,就会出现问题。Android实作用域存储等弃用getExternalStoragePublicDirectory ......因此,我需要找出一个兼容的解决方案,以支持的API 19- 29。我无法使用内部应用程序存储,因为 DownloadManager 会抛出 SecurityException。Androids 文档指出我可以使用 DownloadManager.RequestsetDestinationUri并且它甚至提到我可以使用的 Android Q Context.getExternalFilesDir(String)。但是,当我这样做时,路径仍然是模拟路径:

/storage/emulated/0/Android/data/com.my.package.name/files/Download/myFile.xml
Run Code Online (Sandbox Code Playgroud)

我从下载管理器收到一个回调,表明下载已完成(使用正确的 ID),但随后我无法从保存它的区域获取下载。我检查文件是否存在并返回false:

new File("/storage/emulated/0/Android/data/com.my.package.name/files/Download/myFile.xml").exists();
Run Code Online (Sandbox Code Playgroud)

任何帮助表示赞赏

添加上下文代码。所以设置下载管理器

    private void startDownload() {
        IntentFilter filter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE);
        registerReceiver(downloadReceiver, filter);

        String remoteURL= getString(R.string.remote_url);

        DownloadManager.Request request = new DownloadManager.Request(Uri.parse(remoteUrl));
        request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE);
        request.setTitle(getString(R.string.download_title));
        request.setDescription(getString(R.string.download_description));
        request.setDestinationUri(Uri.fromFile(new File(getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "myFile.xml")));

        DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
        mainDownloadID= manager.enqueue(request);
    }
Run Code Online (Sandbox Code Playgroud)

检查文件是否存在:

new File(getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "myFile.xml").exists(); //this returns false in the onReceive (and download …
Run Code Online (Sandbox Code Playgroud)

android download android-download-manager android-10.0 scoped-storage

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

Android Vertical Switch Widget

使用android,我想得到一个垂直切换小部件实现.据我所知,看起来交换机只有水平方向.我希望得到以下内容:

在此输入图像描述

在浏览了这里的主题并搜索谷歌之后,我还没有找到能够给我这个的东西.我搜索的所有东西都只给我横向实现.

所以我可以生成典型的水平开关

     <Switch
            android:id="@+id/switch_button"
            android:layout_width="130dp"
            android:layout_height="wrap_content"
            android:layout_alignLeft="@+id/label"
            android:layout_gravity="center"
            android:switchMinWidth="130dp"
            android:thumb="@drawable/switch_selector" 
            android:track="@drawable/track_selector" >
     </Switch>
Run Code Online (Sandbox Code Playgroud)

但似乎没有一个好的方法来设置方向.我知道这个问题有点高.是否有一些立即可用的属性允许我进行垂直切换?或者我是否必须创建自定义开关并可能修改onDraw方法以使其垂直翻转?任何帮助表示赞赏.谢谢.

java user-interface android switch-statement

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

Java浮点精度问题

我有一个关于java中浮点运算及其精度的问题.我确实在这里和通过谷歌进行了研究并遇到了一些解决方案,但在我的设计中实施它们时遇到了困难.所以在Java中我正在使用BigDecimal类来使我的计算准确.请注意,变量是double,并且在进行计算时,值的精度最多可达到右侧8位小数.显示的结果(精度)是已知的,这就是我将要存储的当前值.此外,所有值都是动态的(通过方法).传递的参数应该是currentValue +步长.

public void newValue(float value) {

  //Clip to valid range, can't go over minimum/max value
  value = Math.max(minimumValue, Math.min(maximumValue, value));

  // TODO Implement better Floating Point Arithmetic precision

  MathContext mcI = new MathContext(0, RoundingMode.HALF_UP);      
  MathContext mcF = new MathContext(8, RoundingMode.HALF_UP);
  BigDecimal valueBD = new BigDecimal(value, mcF);
  BigDecimal minimumBD = new BigDecimal(minimumValue, mcF);
  BigDecimal stepBD = new BigDecimal(step, mcF);
  BigDecimal currentValueBD = new BigDecimal(currentValue, mcF);


  BigDecimal totalStepsBD = valueBD.subtract(minimumBD, mcF);

  //Ensure value is divisible by stepsize
  totalStepsBD = totalStepsBD.divide(stepBD, mcI); …
Run Code Online (Sandbox Code Playgroud)

java math precision android

6
推荐指数
1
解决办法
385
查看次数