【问题标题】:Bitmap to file android 6.0位图到文件 android 6.0
【发布时间】:2016-11-26 07:47:05
【问题描述】:

我从 url 获取图像并将其保存在设备的内存中。我有这个:

new AsyncTask<String, Void, Bitmap>() {
            protected Bitmap doInBackground(String... iUrl) {
                Bitmap bitmap = null;
                try {
                    URL url = new URL("http://lookw.ru/1/73/1380310809-pitstsa-ch1--16.jpg");
                    bitmap = BitmapFactory.decodeStream(url.openConnection().getInputStream());
                    String filepath = Environment.getExternalStorageDirectory().getAbsolutePath()+ File.separator + "scetchpad";
                    File dir = new File(filepath);
                    File file = new File(dir, "pizza.png");
                    FileOutputStream fileOutputStream = new FileOutputStream(file);
                    bitmap.compress(Bitmap.CompressFormat.PNG, 85, fileOutputStream);
                    fileOutputStream.flush();
                    fileOutputStream.close();
Log.d("LOGI", filepath);


                } catch (Exception e) {

                    e.printStackTrace();
                }
                return bitmap;

            }

            @Override
            protected void onPostExecute(Bitmap bitmap) {
                super.onPostExecute(bitmap);
                ImageView imageView =  (ImageView) findViewById(R.id.imageView);
                assert imageView != null;
                imageView.setImageBitmap(bitmap);
            }
        }.execute();

权限

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

此代码在我的平板电脑(android 4.1)上工作,但是当我在手机(小米米 Max android 6.0)上测试时,我遇到了一些问题。

11-25 18:39:56.260 19383-19480/com.vkramarenko.myapplication W/System.err: java.io.FileNotFoundException: /storage/emulated/0/scetchpad/pizza.png: open failed: ENOENT (No such file or directory)
11-25 18:39:56.260 19383-19480/com.vkramarenko.myapplication W/System.err:     at libcore.io.IoBridge.open(IoBridge.java:452)
11-25 18:39:56.260 19383-19480/com.vkramarenko.myapplication W/System.err:     at java.io.FileOutputStream.<init>(FileOutputStream.java:87)
11-25 18:39:56.260 19383-19480/com.vkramarenko.myapplication W/System.err:     at java.io.FileOutputStream.<init>(FileOutputStream.java:72)
11-25 18:39:56.260 19383-19480/com.vkramarenko.myapplication W/System.err:     at com.vkramarenko.myapplication.MainActivity$1.doInBackground(MainActivity.java:47)
11-25 18:39:56.261 19383-19480/com.vkramarenko.myapplication W/System.err:     at com.vkramarenko.myapplication.MainActivity$1.doInBackground(MainActivity.java:38)
11-25 18:39:56.261 19383-19480/com.vkramarenko.myapplication W/System.err:     at android.os.AsyncTask$2.call(AsyncTask.java:295)
11-25 18:39:56.261 19383-19480/com.vkramarenko.myapplication W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
11-25 18:39:56.261 19383-19480/com.vkramarenko.myapplication W/System.err:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
11-25 18:39:56.261 19383-19480/com.vkramarenko.myapplication W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
11-25 18:39:56.261 19383-19480/com.vkramarenko.myapplication W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
11-25 18:39:56.261 19383-19480/com.vkramarenko.myapplication W/System.err:     at java.lang.Thread.run(Thread.java:818)
11-25 18:39:56.261 19383-19480/com.vkramarenko.myapplication W/System.err: Caused by: android.system.ErrnoException: open failed: ENOENT (No such file or directory)
11-25 18:39:56.261 19383-19480/com.vkramarenko.myapplication W/System.err:     at libcore.io.Posix.open(Native Method)
11-25 18:39:56.262 19383-19480/com.vkramarenko.myapplication W/System.err:     at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186)
11-25 18:39:56.262 19383-19480/com.vkramarenko.myapplication W/System.err:     at libcore.io.IoBridge.open(IoBridge.java:438)
11-25 18:39:56.262 19383-19480/com.vkramarenko.myapplication W/System.err:  ... 10 more

而且我在设备的内存中也没有看到这个目录(/storage/emulated/0),但是一些文件(应用程序的图标)保存在这个目录中。

【问题讨论】:

  • 初始化后请登录filepath
  • don't see this directory(/storage/emulated/0) in memory of device。你是如何“看”的?这是一条非常正常的路径。它会在那里。

标签: android file bitmap


【解决方案1】:

您应该在运行时在Android 6.0 设备上请求WRITE_EXTERNAL_STORAGE 权限。在这里查看更多信息:https://developer.android.com/training/permissions/requesting.html

【讨论】:

    【解决方案2】:

    在 Android 6.0 中,它需要运行时权限才能存储或读取文件。您可以查看以下文档。

    https://developer.android.com/training/permissions/requesting.html

    如果您不想在外部处理此权限,您可以通过将 targetSdkVersion(在 build.gradle 中)文件更改为 22 或以下来避免这种情况。

    默认配置 { ----- targetSdkVersion 22 ------ }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-30
      相关资源
      最近更新 更多