support android M
This commit is contained in:
parent
31e93e2d5c
commit
f652b432da
|
|
@ -1,5 +1,8 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="EntryPointsManager">
|
||||
<entry_points version="2.0" />
|
||||
</component>
|
||||
<component name="MavenImportPreferences">
|
||||
<option name="generalSettings">
|
||||
<MavenGeneralSettings>
|
||||
|
|
@ -7,6 +10,30 @@
|
|||
</MavenGeneralSettings>
|
||||
</option>
|
||||
</component>
|
||||
<component name="NullableNotNullManager">
|
||||
<option name="myDefaultNullable" value="android.support.annotation.Nullable" />
|
||||
<option name="myDefaultNotNull" value="android.support.annotation.NonNull" />
|
||||
<option name="myNullables">
|
||||
<value>
|
||||
<list size="4">
|
||||
<item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.Nullable" />
|
||||
<item index="1" class="java.lang.String" itemvalue="javax.annotation.Nullable" />
|
||||
<item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.Nullable" />
|
||||
<item index="3" class="java.lang.String" itemvalue="android.support.annotation.Nullable" />
|
||||
</list>
|
||||
</value>
|
||||
</option>
|
||||
<option name="myNotNulls">
|
||||
<value>
|
||||
<list size="4">
|
||||
<item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.NotNull" />
|
||||
<item index="1" class="java.lang.String" itemvalue="javax.annotation.Nonnull" />
|
||||
<item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.NonNull" />
|
||||
<item index="3" class="java.lang.String" itemvalue="android.support.annotation.NonNull" />
|
||||
</list>
|
||||
</value>
|
||||
</option>
|
||||
</component>
|
||||
<component name="ProjectLevelVcsManager" settingsEditedManually="false">
|
||||
<OptionsSetting value="true" id="Add" />
|
||||
<OptionsSetting value="true" id="Remove" />
|
||||
|
|
|
|||
45
app/app.iml
45
app/app.iml
|
|
@ -64,14 +64,6 @@
|
|||
<sourceFolder url="file://$MODULE_DIR$/src/main/jni" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/main/rs" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/main/shaders" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/shaders" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/test/res" type="java-test-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/test/assets" type="java-test-resource" />
|
||||
|
|
@ -80,29 +72,54 @@
|
|||
<sourceFolder url="file://$MODULE_DIR$/src/test/jni" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/test/rs" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/test/shaders" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/shaders" isTestSource="true" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/assets" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/blame" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/builds" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/bundles" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/classes" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/dependency-cache" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/dex" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.android.support/appcompat-v7/22.0.0/jars" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.android.support/support-v4/22.0.0/jars" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.android.support/animated-vector-drawable/23.4.0/jars" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.android.support/appcompat-v7/23.4.0/jars" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.android.support/support-v4/23.4.0/jars" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.android.support/support-vector-drawable/23.4.0/jars" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental-classes" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental-runtime-classes" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental-safeguard" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental-verifier" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/instant-run-support" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/jniLibs" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/manifests" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/pre-dexed" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/reload-dex" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/res" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/resources" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/restart-dex" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/rs" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/shaders" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/symbols" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/tmp" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/transforms" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/outputs" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/tmp" />
|
||||
</content>
|
||||
<orderEntry type="jdk" jdkName="Android API 22 Platform" jdkType="Android SDK" />
|
||||
<orderEntry type="jdk" jdkName="Android API 23 Platform" jdkType="Android SDK" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
<orderEntry type="library" exported="" name="appcompat-v7-22.0.0" level="project" />
|
||||
<orderEntry type="library" exported="" name="support-annotations-23.4.0" level="project" />
|
||||
<orderEntry type="library" exported="" name="animated-vector-drawable-23.4.0" level="project" />
|
||||
<orderEntry type="library" exported="" name="support-v4-23.4.0" level="project" />
|
||||
<orderEntry type="library" exported="" name="picasso-2.4.0" level="project" />
|
||||
<orderEntry type="library" exported="" name="support-v4-22.0.0" level="project" />
|
||||
<orderEntry type="library" exported="" name="support-annotations-22.0.0" level="project" />
|
||||
<orderEntry type="library" exported="" name="support-vector-drawable-23.4.0" level="project" />
|
||||
<orderEntry type="library" exported="" name="appcompat-v7-23.4.0" level="project" />
|
||||
<orderEntry type="module" module-name="multi-image-selector" exported="" />
|
||||
</component>
|
||||
</module>
|
||||
|
|
@ -1,13 +1,13 @@
|
|||
apply plugin: 'com.android.application'
|
||||
|
||||
android {
|
||||
compileSdkVersion 22
|
||||
buildToolsVersion "22.0.1"
|
||||
compileSdkVersion 23
|
||||
buildToolsVersion "23.0.3"
|
||||
|
||||
defaultConfig {
|
||||
applicationId "me.nereo.multiimageselector"
|
||||
minSdkVersion 12
|
||||
targetSdkVersion 22
|
||||
targetSdkVersion 23
|
||||
versionCode 1
|
||||
versionName "1.0"
|
||||
}
|
||||
|
|
@ -21,6 +21,6 @@ android {
|
|||
|
||||
dependencies {
|
||||
compile fileTree(include: ['*.jar'], dir: 'libs')
|
||||
compile 'com.android.support:appcompat-v7:22.0.0'
|
||||
compile 'com.android.support:appcompat-v7:23.4.0'
|
||||
compile project(':multi-image-selector')
|
||||
}
|
||||
|
|
|
|||
|
|
@ -24,8 +24,6 @@
|
|||
android:configChanges="orientation|screenSize"
|
||||
android:name="me.nereo.multi_image_selector.MultiImageSelectorActivity" />
|
||||
|
||||
<activity android:name=".GestureImageActivity" />
|
||||
|
||||
</application>
|
||||
|
||||
</manifest>
|
||||
|
|
|
|||
|
|
@ -1,10 +1,16 @@
|
|||
package me.nereo.multiimageselector;
|
||||
|
||||
import android.Manifest;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.Intent;
|
||||
import android.support.v7.app.ActionBarActivity;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.v4.app.ActivityCompat;
|
||||
import android.support.v7.app.AlertDialog;
|
||||
import android.support.v7.app.AppCompatActivity;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
|
|
@ -13,14 +19,15 @@ import android.widget.RadioGroup;
|
|||
import android.widget.TextView;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import me.nereo.multi_image_selector.MultiImageSelectorActivity;
|
||||
import me.nereo.multi_image_selector.MultiImageSelector;
|
||||
|
||||
|
||||
public class MainActivity extends ActionBarActivity {
|
||||
public class MainActivity extends AppCompatActivity {
|
||||
|
||||
private static final int REQUEST_IMAGE = 2;
|
||||
protected static final int REQUEST_STORAGE_READ_ACCESS_PERMISSION = 101;
|
||||
protected static final int REQUEST_STORAGE_WRITE_ACCESS_PERMISSION = 102;
|
||||
|
||||
private TextView mResultText;
|
||||
private RadioGroup mChoiceMode, mShowCamera;
|
||||
|
|
@ -50,48 +57,76 @@ public class MainActivity extends ActionBarActivity {
|
|||
}
|
||||
});
|
||||
|
||||
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
|
||||
int selectedMode = MultiImageSelectorActivity.MODE_MULTI;
|
||||
|
||||
if(mChoiceMode.getCheckedRadioButtonId() == R.id.single){
|
||||
selectedMode = MultiImageSelectorActivity.MODE_SINGLE;
|
||||
}else{
|
||||
selectedMode = MultiImageSelectorActivity.MODE_MULTI;
|
||||
View button = findViewById(R.id.button);
|
||||
if (button != null) {
|
||||
button.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
pickImage();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
boolean showCamera = mShowCamera.getCheckedRadioButtonId() == R.id.show;
|
||||
}
|
||||
|
||||
int maxNum = 9;
|
||||
if(!TextUtils.isEmpty(mRequestNum.getText())){
|
||||
private void pickImage() {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN // Permission was added in API Level 16
|
||||
&& ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)
|
||||
!= PackageManager.PERMISSION_GRANTED) {
|
||||
requestPermission(Manifest.permission.READ_EXTERNAL_STORAGE,
|
||||
getString(R.string.permission_rationale),
|
||||
REQUEST_STORAGE_READ_ACCESS_PERMISSION);
|
||||
}else {
|
||||
boolean showCamera = mShowCamera.getCheckedRadioButtonId() == R.id.show;
|
||||
int maxNum = 9;
|
||||
|
||||
if (!TextUtils.isEmpty(mRequestNum.getText())) {
|
||||
try {
|
||||
maxNum = Integer.valueOf(mRequestNum.getText().toString());
|
||||
} catch (NumberFormatException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
Intent intent = new Intent(MainActivity.this, MultiImageSelectorActivity.class);
|
||||
// 是否显示拍摄图片
|
||||
intent.putExtra(MultiImageSelectorActivity.EXTRA_SHOW_CAMERA, showCamera);
|
||||
// 最大可选择图片数量
|
||||
intent.putExtra(MultiImageSelectorActivity.EXTRA_SELECT_COUNT, maxNum);
|
||||
// 选择模式
|
||||
intent.putExtra(MultiImageSelectorActivity.EXTRA_SELECT_MODE, selectedMode);
|
||||
// 默认选择
|
||||
if(mSelectPath != null && mSelectPath.size()>0){
|
||||
intent.putExtra(MultiImageSelectorActivity.EXTRA_DEFAULT_SELECTED_LIST, mSelectPath);
|
||||
}
|
||||
startActivityForResult(intent, REQUEST_IMAGE);
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
/* findViewById(R.id.button2).setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
Intent intent = new Intent(MainActivity.this, GestureImageActivity.class);
|
||||
startActivity(intent);
|
||||
MultiImageSelector selector = MultiImageSelector.create(MainActivity.this);
|
||||
selector.showCamera(showCamera);
|
||||
selector.count(maxNum);
|
||||
if (mChoiceMode.getCheckedRadioButtonId() == R.id.single) {
|
||||
selector.single();
|
||||
} else {
|
||||
selector.multi();
|
||||
}
|
||||
});*/
|
||||
selector.origin(mSelectPath);
|
||||
selector.start(MainActivity.this, REQUEST_IMAGE);
|
||||
}
|
||||
}
|
||||
|
||||
private void requestPermission(final String permission, String rationale, final int requestCode){
|
||||
if(ActivityCompat.shouldShowRequestPermissionRationale(this, permission)){
|
||||
new AlertDialog.Builder(this)
|
||||
.setTitle(R.string.permission_dialog_title)
|
||||
.setMessage(rationale)
|
||||
.setPositiveButton(R.string.permission_dialog_ok, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
ActivityCompat.requestPermissions(MainActivity.this, new String[]{permission}, requestCode);
|
||||
}
|
||||
})
|
||||
.setNegativeButton(R.string.permission_dialog_cancel, null)
|
||||
.create().show();
|
||||
}else{
|
||||
ActivityCompat.requestPermissions(this, new String[]{permission}, requestCode);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
|
||||
if(requestCode == REQUEST_STORAGE_READ_ACCESS_PERMISSION){
|
||||
if(grantResults[0] == PackageManager.PERMISSION_GRANTED){
|
||||
pickImage();
|
||||
}
|
||||
} else {
|
||||
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -99,7 +134,7 @@ public class MainActivity extends ActionBarActivity {
|
|||
super.onActivityResult(requestCode, resultCode, data);
|
||||
if(requestCode == REQUEST_IMAGE){
|
||||
if(resultCode == RESULT_OK){
|
||||
mSelectPath = data.getStringArrayListExtra(MultiImageSelectorActivity.EXTRA_RESULT);
|
||||
mSelectPath = data.getStringArrayListExtra(MultiImageSelector.EXTRA_RESULT);
|
||||
StringBuilder sb = new StringBuilder();
|
||||
for(String p: mSelectPath){
|
||||
sb.append(p);
|
||||
|
|
|
|||
|
|
@ -5,4 +5,8 @@
|
|||
<!-- Customize your theme here. -->
|
||||
</style>
|
||||
|
||||
<style name="NO_ACTION_BAR" parent="Theme.AppCompat.Light.NoActionBar">
|
||||
|
||||
</style>
|
||||
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -1,12 +1,12 @@
|
|||
apply plugin: 'com.android.library'
|
||||
|
||||
android {
|
||||
compileSdkVersion 22
|
||||
buildToolsVersion "22.0.1"
|
||||
compileSdkVersion 23
|
||||
buildToolsVersion "23.0.3"
|
||||
|
||||
defaultConfig {
|
||||
minSdkVersion 12
|
||||
targetSdkVersion 22
|
||||
targetSdkVersion 23
|
||||
versionCode 1
|
||||
versionName "1.0"
|
||||
}
|
||||
|
|
@ -20,6 +20,6 @@ android {
|
|||
|
||||
dependencies {
|
||||
compile fileTree(dir: 'libs', include: ['*.jar'])
|
||||
compile 'com.android.support:appcompat-v7:22.0.0'
|
||||
compile 'com.android.support:appcompat-v7:23.4.0'
|
||||
compile 'com.squareup.picasso:picasso:2.4.0'
|
||||
}
|
||||
|
|
|
|||
|
|
@ -65,14 +65,6 @@
|
|||
<sourceFolder url="file://$MODULE_DIR$/src/main/jni" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/main/rs" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/main/shaders" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/test/res" type="java-test-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/test/assets" type="java-test-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/test/aidl" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/test/jni" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/test/rs" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/test/shaders" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
|
||||
|
|
@ -81,26 +73,41 @@
|
|||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/shaders" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/test/res" type="java-test-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/test/assets" type="java-test-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/test/aidl" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/test/jni" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/test/rs" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/test/shaders" isTestSource="true" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/annotations" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/assets" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/blame" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/bundles" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/classes" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/dependency-cache" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental-safeguard" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/jniLibs" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/lint" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/manifests" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/res" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/resources" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/rs" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/shaders" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/symbols" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/transforms" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/outputs" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/tmp" />
|
||||
</content>
|
||||
<orderEntry type="jdk" jdkName="Android API 22 Platform" jdkType="Android SDK" />
|
||||
<orderEntry type="jdk" jdkName="Android API 23 Platform" jdkType="Android SDK" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
<orderEntry type="library" exported="" name="appcompat-v7-22.0.0" level="project" />
|
||||
<orderEntry type="library" exported="" name="support-annotations-23.4.0" level="project" />
|
||||
<orderEntry type="library" exported="" name="animated-vector-drawable-23.4.0" level="project" />
|
||||
<orderEntry type="library" exported="" name="support-v4-23.4.0" level="project" />
|
||||
<orderEntry type="library" exported="" name="picasso-2.4.0" level="project" />
|
||||
<orderEntry type="library" exported="" name="support-v4-22.0.0" level="project" />
|
||||
<orderEntry type="library" exported="" name="support-annotations-22.0.0" level="project" />
|
||||
<orderEntry type="library" exported="" name="support-vector-drawable-23.4.0" level="project" />
|
||||
<orderEntry type="library" exported="" name="appcompat-v7-23.4.0" level="project" />
|
||||
</component>
|
||||
</module>
|
||||
|
|
@ -0,0 +1,101 @@
|
|||
package me.nereo.multi_image_selector;
|
||||
|
||||
import android.Manifest;
|
||||
import android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.os.Build;
|
||||
import android.support.v4.app.Fragment;
|
||||
import android.support.v4.content.ContextCompat;
|
||||
import android.widget.Toast;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
/**
|
||||
* 图片选择器
|
||||
* Created by nereo on 16/3/17.
|
||||
*/
|
||||
public class MultiImageSelector {
|
||||
|
||||
public static final String EXTRA_RESULT = MultiImageSelectorActivity.EXTRA_RESULT;
|
||||
|
||||
private boolean mShowCamera = true;
|
||||
private int mMaxCount = 9;
|
||||
private int mMode = MultiImageSelectorActivity.MODE_MULTI;
|
||||
private ArrayList<String> mOriginData;
|
||||
private static MultiImageSelector sSelector;
|
||||
private Context mContext;
|
||||
|
||||
private MultiImageSelector(Context context){
|
||||
mContext = context;
|
||||
}
|
||||
|
||||
public static MultiImageSelector create(Context context){
|
||||
if(sSelector == null){
|
||||
sSelector = new MultiImageSelector(context);
|
||||
}
|
||||
return sSelector;
|
||||
}
|
||||
|
||||
public MultiImageSelector showCamera(boolean show){
|
||||
mShowCamera = show;
|
||||
return sSelector;
|
||||
}
|
||||
|
||||
public MultiImageSelector count(int count){
|
||||
mMaxCount = count;
|
||||
return sSelector;
|
||||
}
|
||||
|
||||
public MultiImageSelector single(){
|
||||
mMode = MultiImageSelectorActivity.MODE_SINGLE;
|
||||
return sSelector;
|
||||
}
|
||||
|
||||
public MultiImageSelector multi(){
|
||||
mMode = MultiImageSelectorActivity.MODE_MULTI;
|
||||
return sSelector;
|
||||
}
|
||||
|
||||
public MultiImageSelector origin(ArrayList<String> images){
|
||||
mOriginData = images;
|
||||
return sSelector;
|
||||
}
|
||||
|
||||
public void start(Activity activity, int requestCode){
|
||||
if(hasPermission()) {
|
||||
activity.startActivityForResult(createIntent(), requestCode);
|
||||
}else{
|
||||
Toast.makeText(mContext, R.string.error_no_permission, Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
}
|
||||
|
||||
public void start(Fragment fragment, int requestCode){
|
||||
if(hasPermission()) {
|
||||
fragment.startActivityForResult(createIntent(), requestCode);
|
||||
}else{
|
||||
Toast.makeText(mContext, R.string.error_no_permission, Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
}
|
||||
|
||||
private boolean hasPermission(){
|
||||
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN){
|
||||
// Permission was added in API Level 16
|
||||
return ContextCompat.checkSelfPermission(mContext, Manifest.permission.READ_EXTERNAL_STORAGE)
|
||||
== PackageManager.PERMISSION_GRANTED;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private Intent createIntent(){
|
||||
Intent intent = new Intent(mContext, MultiImageSelectorActivity.class);
|
||||
intent.putExtra(MultiImageSelectorActivity.EXTRA_SHOW_CAMERA, mShowCamera);
|
||||
intent.putExtra(MultiImageSelectorActivity.EXTRA_SELECT_COUNT, mMaxCount);
|
||||
if(mOriginData != null){
|
||||
intent.putStringArrayListExtra(MultiImageSelectorActivity.EXTRA_DEFAULT_SELECTED_LIST, mOriginData);
|
||||
}
|
||||
intent.putExtra(MultiImageSelectorActivity.EXTRA_SELECT_MODE, mMode);
|
||||
return intent;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,10 +1,15 @@
|
|||
package me.nereo.multi_image_selector;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.graphics.Color;
|
||||
import android.net.Uri;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.support.v4.app.Fragment;
|
||||
import android.support.v4.app.FragmentActivity;
|
||||
import android.support.v7.app.ActionBar;
|
||||
import android.support.v7.app.AppCompatActivity;
|
||||
import android.support.v7.widget.Toolbar;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.widget.Button;
|
||||
|
||||
|
|
@ -12,90 +17,126 @@ import java.io.File;
|
|||
import java.util.ArrayList;
|
||||
|
||||
/**
|
||||
* 多图选择
|
||||
* Multi image selector
|
||||
* Created by Nereo on 2015/4/7.
|
||||
* Updated by nereo on 2016/1/19.
|
||||
* Updated by nereo on 2016/5/18.
|
||||
*/
|
||||
public class MultiImageSelectorActivity extends FragmentActivity implements MultiImageSelectorFragment.Callback{
|
||||
public class MultiImageSelectorActivity extends AppCompatActivity
|
||||
implements MultiImageSelectorFragment.Callback{
|
||||
|
||||
/** 最大图片选择次数,int类型,默认9 */
|
||||
public static final String EXTRA_SELECT_COUNT = "max_select_count";
|
||||
/** 图片选择模式,默认多选 */
|
||||
public static final String EXTRA_SELECT_MODE = "select_count_mode";
|
||||
/** 是否显示相机,默认显示 */
|
||||
public static final String EXTRA_SHOW_CAMERA = "show_camera";
|
||||
/** 选择结果,返回为 ArrayList<String> 图片路径集合 */
|
||||
public static final String EXTRA_RESULT = "select_result";
|
||||
/** 默认选择集 */
|
||||
public static final String EXTRA_DEFAULT_SELECTED_LIST = "default_list";
|
||||
|
||||
/** 单选 */
|
||||
// Single choice
|
||||
public static final int MODE_SINGLE = 0;
|
||||
/** 多选 */
|
||||
// Multi choice
|
||||
public static final int MODE_MULTI = 1;
|
||||
|
||||
/** Max image size,int,{@link #DEFAULT_IMAGE_SIZE} by default */
|
||||
public static final String EXTRA_SELECT_COUNT = "max_select_count";
|
||||
/** Select mode,{@link #MODE_MULTI} by default */
|
||||
public static final String EXTRA_SELECT_MODE = "select_count_mode";
|
||||
/** Whether show camera,true by default */
|
||||
public static final String EXTRA_SHOW_CAMERA = "show_camera";
|
||||
/** Result data set,ArrayList<String>*/
|
||||
public static final String EXTRA_RESULT = "select_result";
|
||||
/** Original data set */
|
||||
public static final String EXTRA_DEFAULT_SELECTED_LIST = "default_list";
|
||||
// Default image size
|
||||
private static final int DEFAULT_IMAGE_SIZE = 9;
|
||||
|
||||
private ArrayList<String> resultList = new ArrayList<>();
|
||||
private Button mSubmitButton;
|
||||
private int mDefaultCount;
|
||||
private int mDefaultCount = DEFAULT_IMAGE_SIZE;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
setTheme(R.style.NO_ACTIONBAR);
|
||||
setContentView(R.layout.activity_default);
|
||||
|
||||
Intent intent = getIntent();
|
||||
mDefaultCount = intent.getIntExtra(EXTRA_SELECT_COUNT, 9);
|
||||
int mode = intent.getIntExtra(EXTRA_SELECT_MODE, MODE_MULTI);
|
||||
boolean isShow = intent.getBooleanExtra(EXTRA_SHOW_CAMERA, true);
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
||||
getWindow().setStatusBarColor(Color.BLACK);
|
||||
}
|
||||
|
||||
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
|
||||
if(toolbar != null){
|
||||
setSupportActionBar(toolbar);
|
||||
}
|
||||
|
||||
final ActionBar actionBar = getSupportActionBar();
|
||||
if (actionBar != null) {
|
||||
actionBar.setDisplayHomeAsUpEnabled(true);
|
||||
}
|
||||
|
||||
final Intent intent = getIntent();
|
||||
mDefaultCount = intent.getIntExtra(EXTRA_SELECT_COUNT, DEFAULT_IMAGE_SIZE);
|
||||
final int mode = intent.getIntExtra(EXTRA_SELECT_MODE, MODE_MULTI);
|
||||
final boolean isShow = intent.getBooleanExtra(EXTRA_SHOW_CAMERA, true);
|
||||
if(mode == MODE_MULTI && intent.hasExtra(EXTRA_DEFAULT_SELECTED_LIST)) {
|
||||
resultList = intent.getStringArrayListExtra(EXTRA_DEFAULT_SELECTED_LIST);
|
||||
}
|
||||
|
||||
Bundle bundle = new Bundle();
|
||||
bundle.putInt(MultiImageSelectorFragment.EXTRA_SELECT_COUNT, mDefaultCount);
|
||||
bundle.putInt(MultiImageSelectorFragment.EXTRA_SELECT_MODE, mode);
|
||||
bundle.putBoolean(MultiImageSelectorFragment.EXTRA_SHOW_CAMERA, isShow);
|
||||
bundle.putStringArrayList(MultiImageSelectorFragment.EXTRA_DEFAULT_SELECTED_LIST, resultList);
|
||||
mSubmitButton = (Button) findViewById(R.id.commit);
|
||||
if(mode == MODE_MULTI){
|
||||
updateDoneText(resultList);
|
||||
mSubmitButton.setVisibility(View.VISIBLE);
|
||||
mSubmitButton.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
if(resultList != null && resultList.size() >0){
|
||||
// Notify success
|
||||
Intent data = new Intent();
|
||||
data.putStringArrayListExtra(EXTRA_RESULT, resultList);
|
||||
setResult(RESULT_OK, data);
|
||||
}else{
|
||||
setResult(RESULT_CANCELED);
|
||||
}
|
||||
finish();
|
||||
}
|
||||
});
|
||||
}else{
|
||||
mSubmitButton.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
getSupportFragmentManager().beginTransaction()
|
||||
.add(R.id.image_grid, Fragment.instantiate(this, MultiImageSelectorFragment.class.getName(), bundle))
|
||||
.commit();
|
||||
if(savedInstanceState == null){
|
||||
Bundle bundle = new Bundle();
|
||||
bundle.putInt(MultiImageSelectorFragment.EXTRA_SELECT_COUNT, mDefaultCount);
|
||||
bundle.putInt(MultiImageSelectorFragment.EXTRA_SELECT_MODE, mode);
|
||||
bundle.putBoolean(MultiImageSelectorFragment.EXTRA_SHOW_CAMERA, isShow);
|
||||
bundle.putStringArrayList(MultiImageSelectorFragment.EXTRA_DEFAULT_SELECTED_LIST, resultList);
|
||||
|
||||
// 返回按钮
|
||||
findViewById(R.id.btn_back).setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
getSupportFragmentManager().beginTransaction()
|
||||
.add(R.id.image_grid, Fragment.instantiate(this, MultiImageSelectorFragment.class.getName(), bundle))
|
||||
.commit();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(MenuItem item) {
|
||||
switch (item.getItemId()) {
|
||||
case android.R.id.home:
|
||||
setResult(RESULT_CANCELED);
|
||||
finish();
|
||||
}
|
||||
});
|
||||
return true;
|
||||
}
|
||||
return super.onOptionsItemSelected(item);
|
||||
}
|
||||
|
||||
// 完成按钮
|
||||
mSubmitButton = (Button) findViewById(R.id.commit);
|
||||
/**
|
||||
* Update done button by select image data
|
||||
* @param resultList selected image data
|
||||
*/
|
||||
private void updateDoneText(ArrayList<String> resultList){
|
||||
int size = 0;
|
||||
if(resultList == null || resultList.size()<=0){
|
||||
mSubmitButton.setText(R.string.action_done);
|
||||
mSubmitButton.setEnabled(false);
|
||||
}else{
|
||||
updateDoneText();
|
||||
size = resultList.size();
|
||||
mSubmitButton.setEnabled(true);
|
||||
}
|
||||
mSubmitButton.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
if(resultList != null && resultList.size() >0){
|
||||
// 返回已选择的图片数据
|
||||
Intent data = new Intent();
|
||||
data.putStringArrayListExtra(EXTRA_RESULT, resultList);
|
||||
setResult(RESULT_OK, data);
|
||||
finish();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void updateDoneText(){
|
||||
mSubmitButton.setText(String.format("%s(%d/%d)",
|
||||
getString(R.string.action_done), resultList.size(), mDefaultCount));
|
||||
mSubmitButton.setText(getString(R.string.action_button_string,
|
||||
getString(R.string.action_done), size, mDefaultCount));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -112,13 +153,7 @@ public class MultiImageSelectorActivity extends FragmentActivity implements Mult
|
|||
if(!resultList.contains(path)) {
|
||||
resultList.add(path);
|
||||
}
|
||||
// 有图片之后,改变按钮状态
|
||||
if(resultList.size() > 0){
|
||||
updateDoneText();
|
||||
if(!mSubmitButton.isEnabled()){
|
||||
mSubmitButton.setEnabled(true);
|
||||
}
|
||||
}
|
||||
updateDoneText(resultList);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -126,19 +161,13 @@ public class MultiImageSelectorActivity extends FragmentActivity implements Mult
|
|||
if(resultList.contains(path)){
|
||||
resultList.remove(path);
|
||||
}
|
||||
updateDoneText();
|
||||
// 当为选择图片时候的状态
|
||||
if(resultList.size() == 0){
|
||||
mSubmitButton.setText(R.string.action_done);
|
||||
mSubmitButton.setEnabled(false);
|
||||
}
|
||||
updateDoneText(resultList);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCameraShot(File imageFile) {
|
||||
if(imageFile != null) {
|
||||
|
||||
// notify system
|
||||
// notify system the image has change
|
||||
sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(imageFile)));
|
||||
|
||||
Intent data = new Intent();
|
||||
|
|
|
|||
|
|
@ -1,7 +1,11 @@
|
|||
package me.nereo.multi_image_selector;
|
||||
|
||||
import android.Manifest;
|
||||
import android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.res.Configuration;
|
||||
import android.database.Cursor;
|
||||
import android.graphics.Color;
|
||||
|
|
@ -11,11 +15,14 @@ import android.net.Uri;
|
|||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.provider.MediaStore;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.annotation.Nullable;
|
||||
import android.support.v4.app.Fragment;
|
||||
import android.support.v4.app.LoaderManager;
|
||||
import android.support.v4.content.ContextCompat;
|
||||
import android.support.v4.content.CursorLoader;
|
||||
import android.support.v4.content.Loader;
|
||||
import android.support.v7.app.AlertDialog;
|
||||
import android.support.v7.widget.ListPopupWindow;
|
||||
import android.text.TextUtils;
|
||||
import android.view.LayoutInflater;
|
||||
|
|
@ -23,7 +30,6 @@ import android.view.View;
|
|||
import android.view.ViewGroup;
|
||||
import android.widget.AbsListView;
|
||||
import android.widget.AdapterView;
|
||||
import android.widget.Button;
|
||||
import android.widget.GridView;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
|
@ -43,40 +49,44 @@ import me.nereo.multi_image_selector.utils.FileUtils;
|
|||
import me.nereo.multi_image_selector.utils.ScreenUtils;
|
||||
|
||||
/**
|
||||
* 图片选择Fragment
|
||||
* Multi image selector Fragment
|
||||
* Created by Nereo on 2015/4/7.
|
||||
* Updated by nereo on 2016/5/18.
|
||||
*/
|
||||
public class MultiImageSelectorFragment extends Fragment {
|
||||
|
||||
public static final String TAG = "me.nereo.multi_image_selector.MultiImageSelectorFragment";
|
||||
public static final String TAG = "MultiImageSelectorFragment";
|
||||
|
||||
private static final int REQUEST_STORAGE_WRITE_ACCESS_PERMISSION = 110;
|
||||
private static final int REQUEST_CAMERA = 100;
|
||||
|
||||
private static final String KEY_TEMP_FILE = "key_temp_file";
|
||||
|
||||
/** 最大图片选择次数,int类型 */
|
||||
public static final String EXTRA_SELECT_COUNT = "max_select_count";
|
||||
/** 图片选择模式,int类型 */
|
||||
public static final String EXTRA_SELECT_MODE = "select_count_mode";
|
||||
/** 是否显示相机,boolean类型 */
|
||||
public static final String EXTRA_SHOW_CAMERA = "show_camera";
|
||||
/** 默认选择的数据集 */
|
||||
public static final String EXTRA_DEFAULT_SELECTED_LIST = "default_result";
|
||||
/** 单选 */
|
||||
// Single choice
|
||||
public static final int MODE_SINGLE = 0;
|
||||
/** 多选 */
|
||||
// Multi choice
|
||||
public static final int MODE_MULTI = 1;
|
||||
// 不同loader定义
|
||||
|
||||
/** Max image size,int,*/
|
||||
public static final String EXTRA_SELECT_COUNT = "max_select_count";
|
||||
/** Select mode,{@link #MODE_MULTI} by default */
|
||||
public static final String EXTRA_SELECT_MODE = "select_count_mode";
|
||||
/** Whether show camera,true by default */
|
||||
public static final String EXTRA_SHOW_CAMERA = "show_camera";
|
||||
/** Result data set,ArrayList<String>*/
|
||||
public static final String EXTRA_RESULT = "select_result";
|
||||
/** Original data set */
|
||||
public static final String EXTRA_DEFAULT_SELECTED_LIST = "default_list";
|
||||
|
||||
// loaders
|
||||
private static final int LOADER_ALL = 0;
|
||||
private static final int LOADER_CATEGORY = 1;
|
||||
// 请求加载系统照相机
|
||||
private static final int REQUEST_CAMERA = 100;
|
||||
|
||||
|
||||
// 结果数据
|
||||
// image result data set
|
||||
private ArrayList<String> resultList = new ArrayList<>();
|
||||
// 文件夹数据
|
||||
// folder result data set
|
||||
private ArrayList<Folder> mResultFolder = new ArrayList<>();
|
||||
|
||||
// 图片Grid
|
||||
private GridView mGridView;
|
||||
private Callback mCallback;
|
||||
|
||||
|
|
@ -85,11 +95,7 @@ public class MultiImageSelectorFragment extends Fragment {
|
|||
|
||||
private ListPopupWindow mFolderPopupWindow;
|
||||
|
||||
// 类别
|
||||
private TextView mCategoryText;
|
||||
// 预览按钮
|
||||
private Button mPreviewBtn;
|
||||
// 底部View
|
||||
private View mPopupAnchorView;
|
||||
|
||||
private int mDesireImageCount;
|
||||
|
|
@ -100,10 +106,10 @@ public class MultiImageSelectorFragment extends Fragment {
|
|||
private File mTmpFile;
|
||||
|
||||
@Override
|
||||
public void onAttach(Activity activity) {
|
||||
super.onAttach(activity);
|
||||
public void onAttach(Context context) {
|
||||
super.onAttach(context);
|
||||
try {
|
||||
mCallback = (Callback) activity;
|
||||
mCallback = (Callback) getActivity();
|
||||
}catch (ClassCastException e){
|
||||
throw new ClassCastException("The Activity must implement MultiImageSelectorFragment.Callback interface...");
|
||||
}
|
||||
|
|
@ -118,13 +124,10 @@ public class MultiImageSelectorFragment extends Fragment {
|
|||
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
|
||||
super.onViewCreated(view, savedInstanceState);
|
||||
|
||||
// 选择图片数量
|
||||
mDesireImageCount = getArguments().getInt(EXTRA_SELECT_COUNT);
|
||||
|
||||
// 图片选择模式
|
||||
final int mode = getArguments().getInt(EXTRA_SELECT_MODE);
|
||||
|
||||
// 默认选择
|
||||
if(mode == MODE_MULTI) {
|
||||
ArrayList<String> tmp = getArguments().getStringArrayList(EXTRA_DEFAULT_SELECTED_LIST);
|
||||
if(tmp != null && tmp.size()>0) {
|
||||
|
|
@ -132,16 +135,13 @@ public class MultiImageSelectorFragment extends Fragment {
|
|||
}
|
||||
}
|
||||
|
||||
// 是否显示照相机
|
||||
mIsShowCamera = getArguments().getBoolean(EXTRA_SHOW_CAMERA, true);
|
||||
mImageAdapter = new ImageGridAdapter(getActivity(), mIsShowCamera, 3);
|
||||
// 是否显示选择指示器
|
||||
mImageAdapter.showSelectIndicator(mode == MODE_MULTI);
|
||||
|
||||
mPopupAnchorView = view.findViewById(R.id.footer);
|
||||
|
||||
mCategoryText = (TextView) view.findViewById(R.id.category_btn);
|
||||
// 初始化,加载所有图片
|
||||
mCategoryText.setText(R.string.folder_all);
|
||||
mCategoryText.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
|
|
@ -162,35 +162,19 @@ public class MultiImageSelectorFragment extends Fragment {
|
|||
}
|
||||
});
|
||||
|
||||
mPreviewBtn = (Button) view.findViewById(R.id.preview);
|
||||
// 初始化,按钮状态初始化
|
||||
if(resultList == null || resultList.size()<=0){
|
||||
mPreviewBtn.setText(R.string.preview);
|
||||
mPreviewBtn.setEnabled(false);
|
||||
}
|
||||
mPreviewBtn.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
// TODO 预览
|
||||
}
|
||||
});
|
||||
|
||||
mGridView = (GridView) view.findViewById(R.id.grid);
|
||||
mGridView.setAdapter(mImageAdapter);
|
||||
mGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
|
||||
@Override
|
||||
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
|
||||
if (mImageAdapter.isShowCamera()) {
|
||||
// 如果显示照相机,则第一个Grid显示为照相机,处理特殊逻辑
|
||||
if (i == 0) {
|
||||
showCameraAction();
|
||||
} else {
|
||||
// 正常操作
|
||||
Image image = (Image) adapterView.getAdapter().getItem(i);
|
||||
selectImageFromGrid(image, mode);
|
||||
}
|
||||
} else {
|
||||
// 正常操作
|
||||
Image image = (Image) adapterView.getAdapter().getItem(i);
|
||||
selectImageFromGrid(image, mode);
|
||||
}
|
||||
|
|
@ -216,7 +200,7 @@ public class MultiImageSelectorFragment extends Fragment {
|
|||
}
|
||||
|
||||
/**
|
||||
* 创建弹出的ListView
|
||||
* Create popup ListView
|
||||
*/
|
||||
private void createPopupFolderList() {
|
||||
Point point = ScreenUtils.getScreenSize(getActivity());
|
||||
|
|
@ -257,7 +241,6 @@ public class MultiImageSelectorFragment extends Fragment {
|
|||
if (null != folder) {
|
||||
mImageAdapter.setData(folder.images);
|
||||
mCategoryText.setText(folder.name);
|
||||
// 设定默认选择
|
||||
if (resultList != null && resultList.size() > 0) {
|
||||
mImageAdapter.setDefaultSelected(resultList);
|
||||
}
|
||||
|
|
@ -265,7 +248,6 @@ public class MultiImageSelectorFragment extends Fragment {
|
|||
mImageAdapter.setShowCamera(false);
|
||||
}
|
||||
|
||||
// 滑动到最初始位置
|
||||
mGridView.smoothScrollToPosition(0);
|
||||
}
|
||||
}, 100);
|
||||
|
|
@ -291,15 +273,13 @@ public class MultiImageSelectorFragment extends Fragment {
|
|||
@Override
|
||||
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
|
||||
super.onActivityCreated(savedInstanceState);
|
||||
// 首次加载所有图片
|
||||
//new LoadImageTask().execute();
|
||||
// load image data
|
||||
getActivity().getSupportLoaderManager().initLoader(LOADER_ALL, null, mLoaderCallback);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onActivityResult(int requestCode, int resultCode, Intent data) {
|
||||
super.onActivityResult(requestCode, resultCode, data);
|
||||
// 相机拍照完成后,返回图片路径
|
||||
if(requestCode == REQUEST_CAMERA){
|
||||
if(resultCode == Activity.RESULT_OK) {
|
||||
if (mTmpFile != null) {
|
||||
|
|
@ -329,67 +309,87 @@ public class MultiImageSelectorFragment extends Fragment {
|
|||
}
|
||||
|
||||
/**
|
||||
* 选择相机
|
||||
* Open camera
|
||||
*/
|
||||
private void showCameraAction() {
|
||||
// 跳转到系统照相机
|
||||
Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
|
||||
if(cameraIntent.resolveActivity(getActivity().getPackageManager()) != null){
|
||||
// 设置系统相机拍照后的输出路径
|
||||
// 创建临时文件
|
||||
try {
|
||||
mTmpFile = FileUtils.createTmpFile(getActivity());
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
if(mTmpFile != null && mTmpFile.exists()) {
|
||||
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mTmpFile));
|
||||
startActivityForResult(cameraIntent, REQUEST_CAMERA);
|
||||
}else{
|
||||
Toast.makeText(getActivity(), "图片错误", Toast.LENGTH_SHORT).show();
|
||||
if(ContextCompat.checkSelfPermission(getContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE)
|
||||
!= PackageManager.PERMISSION_GRANTED){
|
||||
requestPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE,
|
||||
getString(R.string.permission_rationale_write_storage),
|
||||
REQUEST_STORAGE_WRITE_ACCESS_PERMISSION);
|
||||
}else {
|
||||
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
|
||||
if (intent.resolveActivity(getActivity().getPackageManager()) != null) {
|
||||
try {
|
||||
mTmpFile = FileUtils.createTmpFile(getActivity());
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
if (mTmpFile != null && mTmpFile.exists()) {
|
||||
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mTmpFile));
|
||||
startActivityForResult(intent, REQUEST_CAMERA);
|
||||
} else {
|
||||
Toast.makeText(getActivity(), R.string.error_image_not_exist, Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
} else {
|
||||
Toast.makeText(getActivity(), R.string.msg_no_camera, Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void requestPermission(final String permission, String rationale, final int requestCode){
|
||||
if(shouldShowRequestPermissionRationale(permission)){
|
||||
new AlertDialog.Builder(getContext())
|
||||
.setTitle(R.string.permission_dialog_title)
|
||||
.setMessage(rationale)
|
||||
.setPositiveButton(R.string.permission_dialog_ok, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
requestPermissions(new String[]{permission}, requestCode);
|
||||
}
|
||||
})
|
||||
.setNegativeButton(R.string.permission_dialog_cancel, null)
|
||||
.create().show();
|
||||
}else{
|
||||
Toast.makeText(getActivity(), R.string.msg_no_camera, Toast.LENGTH_SHORT).show();
|
||||
requestPermissions(new String[]{permission}, requestCode);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
|
||||
if(requestCode == REQUEST_STORAGE_WRITE_ACCESS_PERMISSION){
|
||||
if(grantResults[0] == PackageManager.PERMISSION_GRANTED){
|
||||
showCameraAction();
|
||||
}
|
||||
} else {
|
||||
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 选择图片操作
|
||||
* @param image
|
||||
* notify callback
|
||||
* @param image image data
|
||||
*/
|
||||
private void selectImageFromGrid(Image image, int mode) {
|
||||
if(image != null) {
|
||||
// 多选模式
|
||||
if(mode == MODE_MULTI) {
|
||||
if (resultList.contains(image.path)) {
|
||||
resultList.remove(image.path);
|
||||
if(resultList.size() != 0) {
|
||||
mPreviewBtn.setEnabled(true);
|
||||
mPreviewBtn.setText(getResources().getString(R.string.preview) + "(" + resultList.size() + ")");
|
||||
}else{
|
||||
mPreviewBtn.setEnabled(false);
|
||||
mPreviewBtn.setText(R.string.preview);
|
||||
}
|
||||
if (mCallback != null) {
|
||||
mCallback.onImageUnselected(image.path);
|
||||
}
|
||||
} else {
|
||||
// 判断选择数量问题
|
||||
if(mDesireImageCount == resultList.size()){
|
||||
Toast.makeText(getActivity(), R.string.msg_amount_limit, Toast.LENGTH_SHORT).show();
|
||||
return;
|
||||
}
|
||||
|
||||
resultList.add(image.path);
|
||||
mPreviewBtn.setEnabled(true);
|
||||
mPreviewBtn.setText(getResources().getString(R.string.preview) + "(" + resultList.size() + ")");
|
||||
if (mCallback != null) {
|
||||
mCallback.onImageSelected(image.path);
|
||||
}
|
||||
}
|
||||
mImageAdapter.select(image);
|
||||
}else if(mode == MODE_SINGLE){
|
||||
// 单选模式
|
||||
if(mCallback != null){
|
||||
mCallback.onSingleImageSelected(image.path);
|
||||
}
|
||||
|
|
@ -409,21 +409,19 @@ public class MultiImageSelectorFragment extends Fragment {
|
|||
|
||||
@Override
|
||||
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
|
||||
CursorLoader cursorLoader = null;
|
||||
if(id == LOADER_ALL) {
|
||||
CursorLoader cursorLoader = new CursorLoader(getActivity(),
|
||||
cursorLoader = new CursorLoader(getActivity(),
|
||||
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, IMAGE_PROJECTION,
|
||||
IMAGE_PROJECTION[4]+">0 AND "+IMAGE_PROJECTION[3]+"=? OR "+IMAGE_PROJECTION[3]+"=? ",
|
||||
new String[]{"image/jpeg", "image/png"}, IMAGE_PROJECTION[2] + " DESC");
|
||||
return cursorLoader;
|
||||
}else if(id == LOADER_CATEGORY){
|
||||
CursorLoader cursorLoader = new CursorLoader(getActivity(),
|
||||
cursorLoader = new CursorLoader(getActivity(),
|
||||
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, IMAGE_PROJECTION,
|
||||
IMAGE_PROJECTION[4]+">0 AND "+IMAGE_PROJECTION[0]+" like '%"+args.getString("path")+"%'",
|
||||
null, IMAGE_PROJECTION[2] + " DESC");
|
||||
return cursorLoader;
|
||||
}
|
||||
|
||||
return null;
|
||||
return cursorLoader;
|
||||
}
|
||||
|
||||
private boolean fileExist(String path){
|
||||
|
|
@ -444,12 +442,12 @@ public class MultiImageSelectorFragment extends Fragment {
|
|||
String name = data.getString(data.getColumnIndexOrThrow(IMAGE_PROJECTION[1]));
|
||||
long dateTime = data.getLong(data.getColumnIndexOrThrow(IMAGE_PROJECTION[2]));
|
||||
Image image = null;
|
||||
if (fileExist(path)) {
|
||||
if (fileExist(path) && !TextUtils.isEmpty(name)) {
|
||||
image = new Image(path, name, dateTime);
|
||||
images.add(image);
|
||||
}
|
||||
if( !hasFolderGened ) {
|
||||
// 获取文件夹名称
|
||||
if( !hasFolderGened && fileExist(path)) {
|
||||
// get all folder data
|
||||
File folderFile = new File(path).getParentFile();
|
||||
if(folderFile != null && folderFile.exists()){
|
||||
String fp = folderFile.getAbsolutePath();
|
||||
|
|
@ -472,16 +470,13 @@ public class MultiImageSelectorFragment extends Fragment {
|
|||
}while(data.moveToNext());
|
||||
|
||||
mImageAdapter.setData(images);
|
||||
// 设定默认选择
|
||||
if(resultList != null && resultList.size()>0){
|
||||
mImageAdapter.setDefaultSelected(resultList);
|
||||
}
|
||||
|
||||
if(!hasFolderGened) {
|
||||
mFolderAdapter.setData(mResultFolder);
|
||||
hasFolderGened = true;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -504,7 +499,7 @@ public class MultiImageSelectorFragment extends Fragment {
|
|||
}
|
||||
|
||||
/**
|
||||
* 回调接口
|
||||
* Callback for host activity
|
||||
*/
|
||||
public interface Callback{
|
||||
void onSingleImageSelected(String path);
|
||||
|
|
|
|||
|
|
@ -85,12 +85,16 @@ public class FolderAdapter extends BaseAdapter {
|
|||
getTotalImageSize(), mContext.getResources().getString(R.string.photo_unit)));
|
||||
if(mFolders.size()>0){
|
||||
Folder f = mFolders.get(0);
|
||||
Picasso.with(mContext)
|
||||
.load(new File(f.cover.path))
|
||||
.error(R.drawable.default_error)
|
||||
.resizeDimen(R.dimen.folder_cover_size, R.dimen.folder_cover_size)
|
||||
.centerCrop()
|
||||
.into(holder.cover);
|
||||
if (f != null) {
|
||||
Picasso.with(mContext)
|
||||
.load(new File(f.cover.path))
|
||||
.error(R.drawable.default_error)
|
||||
.resizeDimen(R.dimen.folder_cover_size, R.dimen.folder_cover_size)
|
||||
.centerCrop()
|
||||
.into(holder.cover);
|
||||
}else{
|
||||
holder.cover.setImageResource(R.drawable.default_error);
|
||||
}
|
||||
}
|
||||
}else {
|
||||
holder.bindData(getItem(i));
|
||||
|
|
@ -151,8 +155,8 @@ public class FolderAdapter extends BaseAdapter {
|
|||
}else{
|
||||
size.setText("*"+mContext.getResources().getString(R.string.photo_unit));
|
||||
}
|
||||
// 显示图片
|
||||
if (data.cover != null) {
|
||||
// 显示图片
|
||||
Picasso.with(mContext)
|
||||
.load(new File(data.cover.path))
|
||||
.placeholder(R.drawable.default_error)
|
||||
|
|
|
|||
|
|
@ -1,5 +1,7 @@
|
|||
package me.nereo.multi_image_selector.bean;
|
||||
|
||||
import android.text.TextUtils;
|
||||
|
||||
/**
|
||||
* 图片实体
|
||||
* Created by Nereo on 2015/4/7.
|
||||
|
|
@ -19,7 +21,7 @@ public class Image {
|
|||
public boolean equals(Object o) {
|
||||
try {
|
||||
Image other = (Image) o;
|
||||
return this.path.equalsIgnoreCase(other.path);
|
||||
return TextUtils.equals(this.path, other.path);
|
||||
}catch (ClassCastException e){
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -42,29 +42,6 @@
|
|||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent" />
|
||||
|
||||
<View
|
||||
android:visibility="gone"
|
||||
android:layout_toLeftOf="@+id/preview"
|
||||
android:layout_width="1dp"
|
||||
android:background="#8828292A"
|
||||
android:layout_height="match_parent" />
|
||||
|
||||
<Button
|
||||
android:visibility="gone"
|
||||
android:id="@+id/preview"
|
||||
tools:text="预览(1)"
|
||||
android:paddingLeft="16dp"
|
||||
android:paddingRight="16dp"
|
||||
android:layout_alignParentRight="true"
|
||||
android:layout_centerVertical="true"
|
||||
android:minHeight="1dp"
|
||||
android:minWidth="1dp"
|
||||
android:background="@null"
|
||||
android:textColor="@color/default_text_color"
|
||||
android:textSize="14sp"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent" />
|
||||
|
||||
</RelativeLayout>
|
||||
|
||||
</RelativeLayout>
|
||||
|
|
|
|||
|
|
@ -1,17 +1,39 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="match_parent" android:layout_height="match_parent">
|
||||
android:background="#181819"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
|
||||
<include
|
||||
<android.support.v7.widget.Toolbar
|
||||
android:id="@+id/toolbar"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="?android:attr/actionBarSize"
|
||||
layout="@layout/cmp_customer_actionbar" />
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@color/actionbar_color"
|
||||
app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
|
||||
android:minHeight="?android:attr/actionBarSize">
|
||||
|
||||
<Button
|
||||
android:id="@+id/commit"
|
||||
android:background="@drawable/action_btn"
|
||||
android:minHeight="1dp"
|
||||
android:minWidth="1dp"
|
||||
android:layout_marginRight="16dp"
|
||||
android:paddingLeft="10dp"
|
||||
android:paddingRight="10dp"
|
||||
android:paddingTop="5dp"
|
||||
android:paddingBottom="5dp"
|
||||
android:textColor="@color/default_text_color"
|
||||
android:textSize="14sp"
|
||||
android:layout_gravity="right"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content" />
|
||||
|
||||
</android.support.v7.widget.Toolbar>
|
||||
|
||||
<FrameLayout
|
||||
android:id="@+id/image_grid"
|
||||
android:background="#181819"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent" />
|
||||
|
||||
|
|
|
|||
|
|
@ -40,29 +40,6 @@
|
|||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent" />
|
||||
|
||||
<View
|
||||
android:visibility="gone"
|
||||
android:layout_toLeftOf="@+id/preview"
|
||||
android:layout_width="1dp"
|
||||
android:background="#8828292A"
|
||||
android:layout_height="match_parent" />
|
||||
|
||||
<Button
|
||||
android:visibility="gone"
|
||||
android:id="@+id/preview"
|
||||
tools:text="预览(1)"
|
||||
android:paddingLeft="16dp"
|
||||
android:paddingRight="16dp"
|
||||
android:layout_alignParentRight="true"
|
||||
android:layout_centerVertical="true"
|
||||
android:minHeight="1dp"
|
||||
android:minWidth="1dp"
|
||||
android:background="@null"
|
||||
android:textColor="@color/default_text_color"
|
||||
android:textSize="14sp"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent" />
|
||||
|
||||
</RelativeLayout>
|
||||
|
||||
</RelativeLayout>
|
||||
|
|
|
|||
|
|
@ -7,4 +7,11 @@
|
|||
<string name="action_done">完成</string>
|
||||
<string name="photo_unit">张</string>
|
||||
<string name="tip_take_photo">拍摄照片</string>
|
||||
<string name="error_image_not_exist">图片错误</string>
|
||||
<string name="error_no_permission">无权限</string>
|
||||
<string name="permission_dialog_title">权限拒绝</string>
|
||||
<string name="permission_dialog_ok">好</string>
|
||||
<string name="permission_dialog_cancel">拒绝</string>
|
||||
<string name="permission_rationale">浏览图片需要您提供浏览存储的权限</string>
|
||||
<string name="permission_rationale_write_storage">保存拍照图片需要您提供写存储权限</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,4 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<color name="actionbar_color">#21282C</color>
|
||||
</resources>
|
||||
|
|
@ -5,6 +5,14 @@
|
|||
<string name="msg_no_camera">No system camera found</string>
|
||||
<string name="msg_amount_limit">Select images amount is limit</string>
|
||||
<string name="action_done">Done</string>
|
||||
<string name="action_button_string">%1$s(%2$d/%3$d)</string>
|
||||
<string name="photo_unit">Shot</string>
|
||||
<string name="tip_take_photo">Take photo</string>
|
||||
<string name="error_image_not_exist">Image error</string>
|
||||
<string name="error_no_permission">Has no permission</string>
|
||||
<string name="permission_dialog_title">Permission Deny</string>
|
||||
<string name="permission_dialog_ok">OK</string>
|
||||
<string name="permission_dialog_cancel">CANCEL</string>
|
||||
<string name="permission_rationale">Storage read permission is needed to pick files.</string>
|
||||
<string name="permission_rationale_write_storage">Storage write permission is needed to save the image.</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,4 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<style name="NO_ACTIONBAR" parent="Theme.AppCompat.Light.NoActionBar"></style>
|
||||
</resources>
|
||||
Loading…
Reference in New Issue