应用是否需要获得打开相机和图库的权限

时间:2017-07-29 02:42:20

标签: android permissions

我曾经认为要从您的应用程序访问相机和图库,需要获得许可,特别是在运行时需要Marshmallow或以上权限

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

但我认为我错了,因为我的应用程序也在未经许可的情况下工作。我有Myapp - &gt;允许。未授予任何许可。 但它如何运作。下面是我的简单代码库:

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

    public void takePhoto ( ) {
        Intent intent = new Intent ( );
        intent.setType ( "image/*" );
        intent.setAction ( Intent.ACTION_GET_CONTENT );//
        startActivityForResult ( Intent.createChooser ( intent, "Select Image" ), SELECT_IMAGE );
    }

    public void onActivityResult ( int requestCode, int resultCode, Intent data ) {
        super.onActivityResult ( requestCode, resultCode, data );
        if ( requestCode == SELECT_IMAGE ) {
            if ( resultCode == Activity.RESULT_OK ) {
                if ( data != null ) {
                    try {
                        Log.e ( "INSIDE------", "onActivityResult: " );
                        Bitmap bitmap = MediaStore.Images.Media.getBitmap ( this.getContentResolver ( ), data.getData ( ) );

                    } catch ( IOException e ) {
                        e.printStackTrace ( );
                    }

                }
            } else if ( resultCode == Activity.RESULT_CANCELED ) {
                Toast.makeText ( this, "Cancelled", Toast.LENGTH_SHORT ).show ( );
            }
        }
    } 

对于相机,这是代码:

 @Override
    protected void onCreate ( Bundle savedInstanceState ) {
        super.onCreate ( savedInstanceState );
        setContentView ( R.layout.activity_main );
        takePhoto (  );
    }
    public void takePhoto() {
        Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        startActivityForResult(takePictureIntent, TAKE_PICTURE);
    }

我的清单

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.example.utkarshshukla.fragmentpractice">

    <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>

</manifest>

我的gradle

apply plugin: 'com.android.application'

android {
    compileSdkVersion 26
    buildToolsVersion "26.0.0"
    defaultConfig {
        applicationId "com.example.utkarshshukla.fragmentpractice"
        minSdkVersion 15
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:26.+'
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    compile 'com.android.support:support-v4:26.+'
    testCompile 'junit:junit:4.12'
}

两个代码都有效,我还没有在清单中声明任何权限。虽然在相机的舱单中宣布许可后,它已经崩溃说需要许可,但没有写清单就可以解决它的原因(对于画廊没有尝试过)。在开发者网站上他们提到要获得许可,但没有提到会是什么意思如果没有获得许可就会发生 问题是没有权限的原因

谢谢

1 个答案:

答案 0 :(得分:3)

根据Consider Using an Intent training

  

在许多情况下,您可以选择两种方式让您的应用执行任务。您可以让您的应用程序请求获得执行操作的权限。或者,您可以让应用程序使用意图让另一个应用程序执行任务。

ACTION_IMAGE_CAPTUREACTION_GET_CONTENT都是使用Intent要求其他应用或系统向您的应用提供内容而无需任何运行时权限的示例。因此,这些操作不需要运行时权限。