【问题标题】:"android.permission.CAMERA" giving error on including in AndroidManifes.xml file“android.permission.CAMERA”在包含在 AndroidManifes.xml 文件中时出错
【发布时间】:2019-05-02 10:40:01
【问题描述】:

这是我的 AndroidManifest.xml 文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.mycamera"> 
<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

这是上面代码对应的java文件

package com.example.mycamera;
import android.content.Intent;
import android.graphics.Bitmap;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

public class MainActivity extends AppCompatActivity {

Button btn;
ImageView imagedisplay;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

  btn = (Button)findViewById(R.id.image);
  imagedisplay = (ImageView)findViewById(R.id.image_capture);

  btn.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {

          Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
          startActivityForResult(intent , 0);
      }
  });
}

@Override
public void onActivityResult(int requestCode , int resultCode, Intent data){
       super.onActivityResult(requestCode,resultCode,data);

       Bitmap bitmap= (Bitmap) data.getExtras().get("data");           
       imagedisplay.setImageBitmap(bitmap);
}

}

即使不包括以下内容也可以正常工作:

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

AndroidManifest.xml 文件中。

但是在包含相机权限时它不起作用并显示您的应用已停止工作的错误。

【问题讨论】:

  • 请添加堆栈跟踪
  • "即使不包含也可以正常工作" -- 然后删除它,或使用requestPermissions() 在运行时请求它。
  • 您没有获得运行时权限因此您在启动相机之前已在 Activity 上添加运行时权限。它会为你工作
  • 包括运行时permission
  • 你好,@CommonsWare 实际上我是 android 新手,所以老实说我没明白。你能用代码解释一下吗?为什么会这样?

标签: android android-camera


【解决方案1】:
 private static final int CAMERA_REQUEST = 1888; 
private ImageView imageView;
private static final int MY_CAMERA_PERMISSION_CODE = 100;

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    this.imageView = (ImageView)this.findViewById(R.id.imageView1);
    Button photoButton = (Button) this.findViewById(R.id.button1);
    photoButton.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            if (checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED)
            {
                requestPermissions(new String[]{Manifest.permission.CAMERA}, MY_CAMERA_PERMISSION_CODE);
            }
            else
            {
                Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
                startActivityForResult(cameraIntent, CAMERA_REQUEST);
            } 
        }
    });
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)
{
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == MY_CAMERA_PERMISSION_CODE)
    {
        if (grantResults[0] == PackageManager.PERMISSION_GRANTED)
        {
            Toast.makeText(this, "camera permission granted", Toast.LENGTH_LONG).show();
            Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
            startActivityForResult(cameraIntent, CAMERA_REQUEST);
        }
        else
        {
            Toast.makeText(this, "camera permission denied", Toast.LENGTH_LONG).show();
        }
    }

    protected void onActivityResult(int requestCode, int resultCode, Intent data)
    {  
        if (requestCode == CAMERA_REQUEST && resultCode == Activity.RESULT_OK)
        {  
            Bitmap photo = (Bitmap) data.getExtras().get("data"); 
            imageView.setImageBitmap(photo);
        }  
    } 
}

【讨论】:

  • 使用必须检查api级别6以上的相机的运行时权限
  • 运行时:protected void onActivityResult(int requestCode, int resultCode, Intent data) 显示错误,即表达式的非法开始。
【解决方案2】:

试试这个:

private boolean isVersionBelowMarshmallow = false;

public boolean checkPermissionForCamera() {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
        isVersionBelowMarshmallow = true;
    }
    if (isVersionBelowMarshmallow)
        return true;
    int result = ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.CAMERA);
    return result == PackageManager.PERMISSION_GRANTED;
}

【讨论】:

    【解决方案3】:

    尝试这些解决方案一次:

    if (checkAndRequestPermissions(getContext())) {
    
        }  
    
    private boolean checkAndRequestPermissions(Context context) {
    
        int ExtstorePermission = ContextCompat.checkSelfPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE);
        int cameraPermission = ContextCompat.checkSelfPermission(context, Manifest.permission.CAMERA);
        List<String> listPermissionsNeeded = new ArrayList<>();
        if (cameraPermission != PackageManager.PERMISSION_GRANTED) {
            listPermissionsNeeded.add(Manifest.permission.CAMERA);
        }
        if (ExtstorePermission != PackageManager.PERMISSION_GRANTED) {
            listPermissionsNeeded.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
        }
        if (!listPermissionsNeeded.isEmpty()) {
            ActivityCompat.requestPermissions(getActivity(), listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]), REQUEST_ID_MULTIPLE_PERMISSIONS);
            return false;
        }
        return true;
    }
    
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    
        if (ContextCompat.checkSelfPermission(getContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            Toast.makeText(getApplicationContext(), "FlagUp Requires Access to Your Storage.", Toast.LENGTH_SHORT).show();
          //  finish();
            //super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
        if (ContextCompat.checkSelfPermission(getContext(), Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
            Toast.makeText(getApplicationContext(), "FlagUp Requires Access to Camara.", Toast.LENGTH_SHORT).show();
           // finish();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-02-03
      • 2014-08-19
      • 2015-04-16
      • 1970-01-01
      • 2015-05-17
      • 1970-01-01
      • 2011-12-29
      • 2016-07-18
      • 1970-01-01
      相关资源
      最近更新 更多