<p>This post is about how to integrate DS Photo Editor SDK into your android apps with the help of a simple ImageEditor App.</p> 
 
 
 
<div class="wp-block-buttons is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-a89b3969 wp-block-buttons-is-layout-flex"> 
<div class="wp-block-button"><strong><a class="wp-block-button__link has-white-color has-text-color has-background" style="background-color: #130367;" href="https://github.com/arunk7839/ImageEditorApp">DOWNLOAD CODE</a></strong></div> 
</div> 
 
 
 
<h4> </h4> 
<p><amp-youtube layout="responsive" width="1200" height="675" data-videoid="4VcIuv6oU8M" title="Android getting started with DS Photo Editor SDK"><a placeholder href="https://youtu.be/4VcIuv6oU8M"><img src="https://i.ytimg.com/vi/4VcIuv6oU8M/hqdefault.jpg" layout="fill" object-fit="cover" alt="Android getting started with DS Photo Editor SDK"></a></amp-youtube></p> 
<h3><span style="color: #000080;"><strong>Creating new project</strong></span></h3> 
<p>1 . Create a new project by going to <span style="color: #008000;"><strong>File ⇒ New Android Project</strong></span>, select <span style="color: #008000;"><strong>Empty</strong></span> Activity, provide <span style="color: #008000;"><strong>app</strong></span> name, select language to <span style="color: #008000;"><strong>kotlin</strong></span> and then finally click on <span style="color: #0000ff;"><strong>finish</strong></span>.</p> 
<p>2 . Download the SDK from <span style="color: #000080;"><strong><a style="color: #000080;" href="https://www.dsphotoeditor.com/android">here</a></strong></span>. Now go to <strong><span style="color: #0000ff;">Android-SDK-Files\Android SDK Files\SDK</span> </strong>and then Copy downloaded <strong><span style="color: #008000;">&#8220;ds-photo-editor-sdk-v10.aar&#8221;</span></strong> into your project&#8217;s <strong><span style="color: #008000;">/libs</span></strong> directory. Create this directory if it doesn&#8217;t already exist in your project.</p> 
<p> 
 
</p> 
<p><img class="size-full wp-image-3179 aligncenter" src="https://c1ctech.com/wp-content/uploads/2022/04/abc.png" alt="" width="332" height="255" /></p> 
<p>3. Open the project-level build.gradle, and update the repositories section as below.</p> 
<p><span style="color: #0000ff;"><strong>build.gradle (project-level)</strong></span></p> 
<pre>allprojects {<br /> repositories {<br /> <strong><span style="color: #008000;">jcenter()</span></strong><br /><strong><span style="color: #008000;"> google()</span></strong><br /><strong><span style="color: #008000;"> flatDir {</span></strong><br /><strong><span style="color: #008000;"> dirs 'libs'}</span></strong><br /> }<br />}</pre> 
<p>4. Open the app-level build.gradle file, and update <span style="color: #008000;"><strong>defaultConfig</strong></span> and <span style="color: #008000;"><strong>dependencies</strong></span> as below.</p> 
<p><span style="color: #0000ff;"><strong>build.gradle (app-level)</strong></span></p> 
<pre>android {<br /> compileSdk 31<br /> defaultConfig {<br /> applicationId "com.c1ctech.imageeditorapp"<br /> minSdk 23<br /> targetSdk 31<br /> versionCode 1<br /> versionName "1.0"<br /> testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"<br /> <span style="color: #008000;"><strong> renderscriptTargetApi 21</strong></span><br /><span style="color: #008000;"><strong> renderscriptSupportModeEnabled true</strong></span><br /> }<br /><br /> buildTypes {<br /> release {<br /> minifyEnabled false<br /> proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'<br /> }<br /> }<br /> compileOptions {<br /> sourceCompatibility JavaVersion.VERSION_1_8<br /> targetCompatibility JavaVersion.VERSION_1_8<br /> }<br /> kotlinOptions {<br /> jvmTarget = '1.8'<br /> }<br /><br /><span style="color: #0000ff;"><strong>//to enable viewBinding</strong></span><br /><span style="color: #0000ff;"><strong>//not a part of ds photo editor integration</strong></span><br /> <span style="color: #008000;"><strong>viewBinding {</strong></span><br /><span style="color: #008000;"><strong> enabled = true</strong></span><br /><span style="color: #008000;"><strong> }</strong></span><br />}<br /><br />dependencies {<br /> implementation 'androidx.core:core-ktx:1.7.0'<br /> implementation 'androidx.appcompat:appcompat:1.4.1'<br /> implementation 'com.google.android.material:material:1.5.0'<br /> implementation 'androidx.constraintlayout:constraintlayout:2.1.3'<br /> testImplementation 'junit:junit:4.13.2'<br /> androidTestImplementation 'androidx.test.ext:junit:1.1.3'<br /> androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'<br /><br /> <strong><span style="color: #008000;"> // DS Photo Editor SDK</span></strong><br /><br /><strong><span style="color: #0000ff;"> implementation(name:'ds-photo-editor-sdk-v10', ext:'aar')</span></strong><br /><br /><strong><span style="color: #008000;"> // SDK related dependencies</span></strong><br /><br /> <strong><span style="color: #0000ff;">implementation "io.reactivex.rxjava3:rxjava:3.1.4"</span></strong><br /><br /><strong><span style="color: #0000ff;"> implementation 'io.reactivex.rxjava3:rxandroid:3.0.0'</span></strong><br /><br /><strong><span style="color: #0000ff;"> implementation 'com.github.bumptech.glide:glide:4.13.0'</span></strong><br /><br /><strong><span style="color: #0000ff;"> annotationProcessor 'com.github.bumptech.glide:compiler:4.13.0'</span></strong><br />}</pre> 
<p>5. Open the <span style="color: #008000;"><strong>AndroidManifest.xml</strong></span> file and add the below changes as shown below:</p> 
<ul> 
<li>Photo editing apps need more memories than normal apps, so make sure to set <span style="color: #008000;"><strong>android:largeHeap</strong></span> to be true in your application declaration.</li> 
<li>Update the manifest file to include the SDK activities and required permissions.</li> 
</ul> 
<p><span style="color: #0000ff;"><strong>AndroidManifest.xml</strong></span></p> 
<pre><;?xml version="1.0" encoding="utf-8"?>;<br /><;manifest xmlns:android="http://schemas.android.com/apk/res/android"<br /> package="com.c1ctech.imageeditorapp">;<br /><br /> <strong><span style="color: #008000;"> <;uses-permission android:name="android.permission.INTERNET" />;</span></strong><br /><strong><span style="color: #008000;"> <;uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />;</span></strong><br /><strong><span style="color: #008000;"> <;uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />;</span></strong><br /><br /> <;application<br /> android:allowBackup="true"<br /> android:icon="@mipmap/ic_launcher"<br /> android:label="@string/app_name"<br /><strong><span style="color: #008000;"> android:largeHeap="true"</span></strong><br /> android:roundIcon="@mipmap/ic_launcher_round"<br /> android:supportsRtl="true"<br /> android:theme="@style/Theme.ImageEditorApp">;<br /> <;activity<br /> android:name=".MainActivity"<br /> android:exported="true">;<br /> <;intent-filter>;<br /> <;action android:name="android.intent.action.MAIN" />;<br /><br /> <;category android:name="android.intent.category.LAUNCHER" />;<br /> <;/intent-filter>;<br /> <;/activity>;<br /><br /> <strong><span style="color: #008000;"><;activity</span></strong><br /><br /><strong><span style="color: #008000;"> android:name="com.dsphotoeditor.sdk.activity.DsPhotoEditorActivity"</span></strong><br /><br /><strong><span style="color: #008000;"> android:screenOrientation="portrait"</span></strong><br /><br /><strong><span style="color: #008000;"> android:theme="@android:style/Theme.Holo.NoActionBar" />;</span></strong><br /><br /><strong><span style="color: #008000;"> <;activity</span></strong><br /><br /><strong><span style="color: #008000;"> android:name="com.dsphotoeditor.sdk.activity.DsPhotoEditorStickerActivity"</span></strong><br /><br /><strong><span style="color: #008000;"> android:screenOrientation="portrait"</span></strong><br /><br /><strong><span style="color: #008000;"> android:theme="@android:style/Theme.Holo.NoActionBar" />;</span></strong><br /><br /><strong><span style="color: #008000;"> <;activity</span></strong><br /><br /><strong><span style="color: #008000;"> android:name="com.dsphotoeditor.sdk.activity.DsPhotoEditorTextActivity"</span></strong><br /><br /><strong><span style="color: #008000;"> android:screenOrientation="portrait"</span></strong><br /><br /><strong><span style="color: #008000;"> android:theme="@android:style/Theme.Holo.NoActionBar"</span></strong><br /><br /><strong><span style="color: #008000;"> android:windowSoftInputMode="adjustPan" />;</span></strong><br /><br /><strong><span style="color: #008000;"> <;activity</span></strong><br /><br /><strong><span style="color: #008000;"> android:name="com.dsphotoeditor.sdk.activity.DsPhotoEditorCropActivity"</span></strong><br /><br /><strong><span style="color: #008000;"> android:screenOrientation="portrait"</span></strong><br /><br /><strong><span style="color: #008000;"> android:theme="@android:style/Theme.Holo.NoActionBar" />;</span></strong><br /><br /><strong><span style="color: #008000;"> <;activity</span></strong><br /><br /><strong><span style="color: #008000;"> android:name="com.dsphotoeditor.sdk.activity.DsPhotoEditorDrawActivity"</span></strong><br /><br /><strong><span style="color: #008000;"> android:screenOrientation="portrait"</span></strong><br /><br /><strong><span style="color: #008000;"> android:theme="@android:style/Theme.Holo.NoActionBar" />;<br /></span></strong><br /> <;/application>;<br /><br /><;/manifest>;</pre> 
<p><span style="color: #000080;"><strong>Note:</strong></span> In order to save edited photos on android devices, you will need to request storage permissions at run time for Android 6.0+. </p>
<!-- WP QUADS Content Ad Plugin v. 2.0.98.1 -->
<div class="quads-location quads-ad2" id="quads-ad2" style="float:none;margin:0px;">

</div>
 
<h4><span style="color: #000080;"><strong>Creating Layout File</strong></span></h4> 
<p>6. The below layout file defines the layout of <span style="color: #008000;"><strong>MainActivity</strong></span> which consists of a button and an imageView.</p> 
<p><strong><span style="color: #0000ff;">activity_main.xml</span></strong></p> 
<pre><;?xml version="1.0" encoding="utf-8"?>;<br /><;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"<br /> xmlns:app="http://schemas.android.com/apk/res-auto"<br /> xmlns:tools="http://schemas.android.com/tools"<br /> android:layout_width="match_parent"<br /> android:layout_height="match_parent"<br /> android:orientation="vertical"<br /> android:padding="16dp"<br /> tools:context=".MainActivity">;<br /><br /> <;Button<br /> android:id="@+id/btnPickImage"<br /> android:layout_width="wrap_content"<br /> android:layout_height="wrap_content"<br /> android:layout_gravity="center"<br /> android:text="Pick Image"<br /> android:textAllCaps="false"<br /> app:layout_constraintBottom_toBottomOf="parent"<br /> app:layout_constraintLeft_toLeftOf="parent"<br /> app:layout_constraintRight_toRightOf="parent"<br /> app:layout_constraintTop_toTopOf="parent" />;<br /><br /> <;ImageView<br /> android:id="@+id/imageView"<br /> android:layout_width="match_parent"<br /> android:layout_height="match_parent"<br /> android:layout_marginTop="8dp"<br /> android:adjustViewBounds="true" />;<br /><br /><;/LinearLayout>;</pre> 
<h4><span style="color: #000080;"><strong>Complete MainActivity Code</strong></span></h4> 
<p>7. The MainActivity file contains the below code:</p> 
<p><strong><span style="color: #0000ff;">MainActivity.kt</span></strong></p> 
<pre>package com.c1ctech.imageeditorapp<br /><br />import android.app.Activity<br />import android.content.Intent<br />import android.content.pm.PackageManager<br />import android.net.Uri<br />import android.os.Build<br />import android.os.Bundle<br />import android.widget.Toast<br />import androidx.activity.result.ActivityResult<br />import androidx.activity.result.ActivityResultCallback<br />import androidx.activity.result.ActivityResultLauncher<br />import androidx.activity.result.contract.ActivityResultContracts<br />import androidx.appcompat.app.AppCompatActivity<br />import androidx.core.app.ActivityCompat<br />import com.c1ctech.imageeditorapp.databinding.ActivityMainBinding<br />import com.dsphotoeditor.sdk.activity.DsPhotoEditorActivity<br />import com.dsphotoeditor.sdk.utils.DsPhotoEditorConstants<br /><br />class MainActivity : AppCompatActivity() {<br /><br /> lateinit var activityMainBinding: ActivityMainBinding<br /> var imageActivityResultLauncher: ActivityResultLauncher<;Intent>;? = null<br /> var saveImageActivityResultLauncher: ActivityResultLauncher<;Intent>;? = null<br /><br /> override fun onCreate(savedInstanceState: Bundle?) {<br /> super.onCreate(savedInstanceState)<br /> activityMainBinding = ActivityMainBinding.inflate(layoutInflater)<br /> setContentView(activityMainBinding.root)<br /><br /> activityMainBinding.btnPickImage.setOnClickListener {<br /> checkPermission()<br /> }<br /><br /> imageActivityResultLauncher = registerForActivityResult(<br /> ActivityResultContracts.StartActivityForResult(),<br /> ActivityResultCallback<;ActivityResult>;() {<br /><br /> if (it.resultCode == Activity.RESULT_OK) {<br /><br /> val uri: Uri? = it.data?.data<br /> var dsPhotoEditorIntent = Intent(this, DsPhotoEditorActivity::class.java)<br /> dsPhotoEditorIntent.data = uri<br /><br /> <span style="color: #008000;"><strong>// An optional parameter, to specify the directory to save the output image on device's external storage.</strong></span><br /><span style="color: #008000;"><strong> // If the output directory is omitted, the edited photo will be saved into a folder called "DS_Photo_Editor" by default.</strong></span><br /> dsPhotoEditorIntent.putExtra(<br /> DsPhotoEditorConstants.DS_PHOTO_EDITOR_OUTPUT_DIRECTORY,<br /> "Images"<br /> )<br /><br /> val toolsToHide = intArrayOf(<br /> DsPhotoEditorActivity.TOOL_WARMTH,<br /> DsPhotoEditorActivity.TOOL_SATURATION,<br /> DsPhotoEditorActivity.TOOL_VIGNETTE,<br /> DsPhotoEditorActivity.TOOL_EXPOSURE<br /> )<br /><br /> <strong><span style="color: #008000;">// if you don't want some of the tools to show up.</span></strong><br /><strong><span style="color: #008000;"> // Just simply pass in the tools to hide in the UI.</span></strong><br /> dsPhotoEditorIntent.putExtra(<br /> DsPhotoEditorConstants.DS_PHOTO_EDITOR_TOOLS_TO_HIDE,<br /> toolsToHide<br /> )<br /> saveImageActivityResultLauncher?.launch(dsPhotoEditorIntent)<br /> }<br /> })<br /><br /> saveImageActivityResultLauncher = registerForActivityResult(<br /> ActivityResultContracts.StartActivityForResult(),<br /> ActivityResultCallback<;ActivityResult>;() {<br /><br /> if (it.resultCode == Activity.RESULT_OK) {<br /><br /><strong><span style="color: #008000;"> //handle the result uri ,by displaying it in an imageView</span></strong><br /> val uri: Uri? = it.data?.data<br /><br /> activityMainBinding.imageView.setImageURI(uri)<br /> Toast.makeText(this, "Photo Saved", Toast.LENGTH_SHORT).show()<br /> }<br /> })<br /> }<br /><br /> private fun checkPermission() {<br /> var permission = ActivityCompat.checkSelfPermission(<br /> this,<br /> android.Manifest.permission.WRITE_EXTERNAL_STORAGE<br /> )<br /><br /><strong><span style="color: #008000;"> //for android version Q and above, we are directly calling the pickImage() method</span></strong><br /> if (Build.VERSION.SDK_INT >;= Build.VERSION_CODES.Q) {<br /> pickImage()<br /> } else {<br /><strong><span style="color: #008000;"> //requesting permission, if permission is not granted</span></strong><br /> if (permission != PackageManager.PERMISSION_GRANTED)<br /> ActivityCompat.requestPermissions(<br /> this,<br /> arrayOf(android.Manifest.permission.WRITE_EXTERNAL_STORAGE),<br /> 100<br /> )<br /> else<br /> pickImage()<br /> }<br /> }<br /><br /> private fun pickImage() {<br /> var intent = Intent(Intent.ACTION_PICK)<br /> intent.type = "image/*"<br /> setResult(100, intent)<br /> imageActivityResultLauncher?.launch(intent)<br /> }<br /><br /><strong><span style="color: #008000;"> //Callback for the result from requesting permissions.</span></strong><br /> override fun onRequestPermissionsResult(<br /> requestCode: Int,<br /> permissions: Array<;out String>;,<br /> grantResults: IntArray<br /> ) {<br /> super.onRequestPermissionsResult(requestCode, permissions, grantResults)<br /><br /> if (requestCode == 100 &;&; grantResults.size >; 0 &;&; grantResults[0] == PackageManager.PERMISSION_GRANTED)<br /> pickImage()<br /> else<br /> Toast.makeText(this, "Permission denied", Toast.LENGTH_SHORT).show()<br /> }<br />}</pre> 
<p>When you run the app it will look like this:</p> 
<p><img class="alignnone wp-image-3182" src="https://c1ctech.com/wp-content/uploads/2022/04/Screenshot_20220411-144102_Android-System-498x1024.jpg" alt="" width="344" height="708" /> <img class="alignnone wp-image-3183" src="https://c1ctech.com/wp-content/uploads/2022/04/Screenshot_20220411-144145_ImageEditorApp-498x1024.jpg" alt="" width="344" height="708" />

