【问题标题】:doesn't show picture in android 6 and above在 android 6 及更高版本中不显示图片
【发布时间】:2016-09-13 03:28:43
【问题描述】:

我正在尝试学习如何在应用程序中使用相机,这就是我所达到的,这个想法是有一个打开相机的按钮,并且在我们拍照后照片会立即显示在屏幕上,第二个按钮来自早期版本,无法立即显示图片,必须单击才能显示。

无论如何,我的问题是这段代码没有在 android 6 上显示图片。在我的 android 5 设备上它工作正常。图片保存在“sdcard/camera_app/cam_image.jpg”路径中该按钮无法正常工作,所以我在想有关 imageview 的某些内容已从 android 5 更改为 6?问题几乎是如何使这项工作适用于 android 6 手机

public class Add_Comment_Picture extends AppCompatActivity {
    static final int CAM_REQUEST = 1;
    ImageView imageView;
    Button button;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add__comment__picture);
        button = (Button) findViewById(R.id.button);
        imageView = (ImageView) findViewById(R.id.imageView);
        Button button2 = (Button) findViewById(R.id.button3);
        button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                Intent camera_intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                File file = getFile();
                camera_intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
                startActivityForResult(camera_intent , CAM_REQUEST);
            }
        });
        button2.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                String path = "sdcard/camera_app/cam_image.jpg";
                imageView.setImageDrawable(Drawable.createFromPath(path));

            }
        });




    }

    private File getFile()
    {
        File folder = new File("sdcard/camera_app");
        if (!folder.exists())
        {
            folder.mkdir();
        }
        File image_file = new File(folder,"cam_image.jpg");
        return image_file;
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        String path = "sdcard/camera_app/cam_image.jpg";
        imageView.setImageDrawable(Drawable.createFromPath(path));
        super.onActivityResult(requestCode, resultCode, data);
    }

}

【问题讨论】:

  • 查看我的编辑以获取更多参考@Yuval Eliav

标签: android imageview android-camera onactivityresult


【解决方案1】:

您需要以编程方式授予 READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL STRANGE 权限。

清单权限在 Android 6 上不起作用

使用棉花糖(最新版本的 Android)。我们在使用 敏感 权限方面有一些限制,例如:存储、联系人访问等。在版本中要在清单中授予这些权限,我们需要在 运行时向用户请求它们>.

更多详情请参考:Android M permissions

有关编码参考,请参考这个 SO 问题:Android marshmallow request permission?

在您的活动中添加此代码:

@Override
protected void onStart() {
    super.onStart();

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

        int hasWritePermission = checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE);
        int hasReadPermission = checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE);
        int hasCameraPermission = checkSelfPermission(Manifest.permission.CAMERA);

        List<String> permissions = new ArrayList<String>();
        if (hasWritePermission != PackageManager.PERMISSION_GRANTED) {
            permissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);

        } 

        if (hasReadPermission != PackageManager.PERMISSION_GRANTED) {
            permissions.add(Manifest.permission.READ_EXTERNAL_STORAGE);

        } 

        if (hasCameraPermission != PackageManager.PERMISSION_GRANTED) {
            permissions.add(Manifest.permission.CAMERA);

        } 
        if (!permissions.isEmpty()) {
            requestPermissions(permissions.toArray(new String[permissions.size()]), 111);
        }
    }


}

在 onActivityResult 之后添加:

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    switch (requestCode) {
        case 111: {
            for (int i = 0; i < permissions.length; i++) {
                if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {
                    System.out.println("Permissions --> " + "Permission Granted: " + permissions[i]);


                } else if (grantResults[i] == PackageManager.PERMISSION_DENIED) {
                    System.out.println("Permissions --> " + "Permission Denied: " + permissions[i]);

                }
            }
        }
        break;
        default: {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }
}

【讨论】:

  • 当我尝试从三星 s3 设备获取图像时,它返回空路径。那么如何解决这个问题呢?你能提供解决方案吗
  • 你能告诉我你是如何检索图像的吗?通过 contentResolver ?? @AnandSavjani
【解决方案2】:

android 6.0 权限结构发生变化后。您必须检查运行时的权限。例如,您将从图库中选择一张图片,用户在进入图库之前授予图库访问权限。

您可以查看此文档以了解此新内容。

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

您的问题的示例代码

if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
            == PackageManager.PERMISSION_GRANTED) {
        Log.v(TAG,"Permission is granted");
        return true;
  }

如果没有,您需要请求用户授予您的应用权限:

ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE);

祝你好运:)

【讨论】:

  • 你能详细说明我应该使用什么请求代码或将 if 语句放在哪里?也谢谢你的回答,我对这个问题有了更好的理解。
  • 你可以使用你想要的数字,因为它是用于 onRequestPermissionsResult 函数的。这里也是运行时权限的一个很好的例子。 learn2crack.com/2015/10/android-marshmallow-permissions.html
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-11
  • 2018-06-19
  • 1970-01-01
  • 1970-01-01
  • 2018-03-04
相关资源
最近更新 更多