我曾经认为要从您的应用程序访问相机和图库,需要获得许可,特别是在运行时需要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'
}
两个代码都有效,我还没有在清单中声明任何权限。虽然在相机的舱单中宣布许可后,它已经崩溃说需要许可,但没有写清单就可以解决它的原因(对于画廊没有尝试过)。在开发者网站上他们提到要获得许可,但没有提到会是什么意思如果没有获得许可就会发生 问题是没有权限的原因
谢谢
答案 0 :(得分:3)
根据Consider Using an Intent training:
在许多情况下,您可以选择两种方式让您的应用执行任务。您可以让您的应用程序请求获得执行操作的权限。或者,您可以让应用程序使用意图让另一个应用程序执行任务。
ACTION_IMAGE_CAPTURE
和ACTION_GET_CONTENT
都是使用Intent
要求其他应用或系统向您的应用提供内容而无需任何运行时权限的示例。因此,这些操作不需要运行时权限。