title: Error message with code: “URL scheme in your app's manifest is not set up correctly.”
body: <p>Hi again this time I am posting the code.Please someone verify and do let me know what is problem I am facing here. I am trying to install apk in mobile via eclipse but I keep on getting error "URL scheme in your app's manifest is not set up correctly. You should have a com.dropbox.client2.android.AuthActivity with the scheme:" does anyone have an idea how to tackle this error. Thank you.</p>
  
  <p>Manifest code:-`</p>
  
  <pre><code>&lt;?xml version="1.0" encoding="utf-8"?&gt;
      &lt;manifest xmlns:android="http://schemas.android.com/apk/res/android"
            package="com.dropbox.android.sample"
            android:versionCode="1"
            android:versionName="1.0"&gt;
  
        &lt;uses-sdk android:minSdkVersion="19" /&gt;
  
        &lt;uses-permission android:name="android.permission.INTERNET" /&gt;
        &lt;uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/&gt;
  
        &lt;application android:icon="@drawable/icon" android:label="@string/app_name"&gt;
          &lt;activity
  
            android:name=".DBRoulette"
            android:label="@string/app_name"
            android:configChanges="orientation|keyboard"&gt;
            &lt;intent-filter&gt;
              &lt;action android:name="android.intent.action.MAIN" /&gt;
              &lt;category android:name="android.intent.category.LAUNCHER" /&gt;
            &lt;/intent-filter&gt;
          &lt;/activity&gt;
  
          &lt;activity
            android:name="com.dropbox.client2.android.AuthActivitywith"
            android:launchMode="singleTask"
            android:configChanges="orientation|keyboard"&gt;
            &lt;intent-filter&gt;
              &lt;!-- Change this to be db- followed by your app key --&gt;
              &lt;data android:scheme="db-8bptwiadb9rgms2" /&gt;
              &lt;action android:name="android.intent.action.VIEW" /&gt;
              &lt;category android:name="android.intent.category.BROWSABLE"/&gt;
              &lt;category android:name="android.intent.category.DEFAULT" /&gt;
            &lt;/intent-filter&gt;
          &lt;/activity&gt;
  
        &lt;/application&gt;
      &lt;/manifest&gt; 
  `
  </code></pre>
  
  <p>Java code:-`</p>
  
  <pre><code> package com.dropbox.android.sample;
  
      import java.io.File;
      import java.text.DateFormat;
      import java.text.SimpleDateFormat;
      import java.util.Date;
  
      import android.app.Activity;
      import android.content.ActivityNotFoundException;
      import android.content.Intent;
      import android.content.SharedPreferences;
      import android.content.SharedPreferences.Editor;
      import android.content.pm.PackageManager;
      import android.net.Uri;
      import android.os.Bundle;
      import android.os.Environment;
      import android.provider.MediaStore;
      import android.util.Log;
      import android.view.View;
      import android.view.View.OnClickListener;
      import android.widget.Button;
      import android.widget.ImageView;
      import android.widget.LinearLayout;
      import android.widget.Toast;
  
      import com.dropbox.client2.DropboxAPI;
      import com.dropbox.client2.android.AndroidAuthSession;
      import com.dropbox.client2.android.AuthActivity;
      import com.dropbox.client2.session.AccessTokenPair;
      import com.dropbox.client2.session.AppKeyPair;
  
  
      public class DBRoulette extends Activity {
          private static final String TAG = "DBRoulette";
  
          ///////////////////////////////////////////////////////////////////////////
          //                      Your app-specific settings.                      //
          ///////////////////////////////////////////////////////////////////////////
  
          // Replace this with your app key and secret assigned by Dropbox.
          // Note that this is a really insecure way to do this, and you shouldn't
          // ship code which contains your key &amp; secret in such an obvious way.
          // Obfuscation is good.
          final static private String APP_KEY = "8bptwiadb9rgms2E";
          final static private String APP_SECRET = "i7bh698kx6qldk7";
  
          ///////////////////////////////////////////////////////////////////////////
          //                      End app-specific settings.                       //
          ///////////////////////////////////////////////////////////////////////////
  
          // You don't need to change these, leave them alone.
          final static private String ACCOUNT_PREFS_NAME = "prefs";
          final static private String ACCESS_KEY_NAME = "ACCESS_KEY";
          final static private String ACCESS_SECRET_NAME = "ACCESS_SECRET";
  
          private static final boolean USE_OAUTH1 = false;
  
          DropboxAPI&lt;AndroidAuthSession&gt; mApi;
  
          private boolean mLoggedIn;
  
          // Android widgets
          private Button mSubmit;
          private LinearLayout mDisplay;
          private Button mPhoto;
          private Button mRoulette;
  
          private ImageView mImage;
  
          private final String PHOTO_DIR = "/Photos/";
  
          final static private int NEW_PICTURE = 1;
          private String mCameraFileName;
  
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
  
              if (savedInstanceState != null) {
                  mCameraFileName = savedInstanceState.getString("mCameraFileName");
              }
  
              // We create a new AuthSession so that we can use the Dropbox API.
              AndroidAuthSession session = buildSession();
              mApi = new DropboxAPI&lt;AndroidAuthSession&gt;(session);
  
              // Basic Android widgets
              setContentView(R.layout.main);
  
              checkAppKeySetup();
  
              mSubmit = (Button)findViewById(R.id.auth_button);
  
              mSubmit.setOnClickListener(new OnClickListener() {
                  public void onClick(View v) {
                      // This logs you out if you're logged in, or vice versa
                      if (mLoggedIn) {
                          logOut();
                      } else {
                          // Start the remote authentication
                          if (USE_OAUTH1) {
                              mApi.getSession().startAuthentication(DBRoulette.this);
                          } else {
                              mApi.getSession().startOAuth2Authentication(DBRoulette.this);
                          }
                      }
                  }
              });
  
              mDisplay = (LinearLayout)findViewById(R.id.logged_in_display);
  
              // This is where a photo is displayed
              mImage = (ImageView)findViewById(R.id.image_view);
  
              // This is the button to take a photo
              mPhoto = (Button)findViewById(R.id.photo_button);
  
              mPhoto.setOnClickListener(new OnClickListener() {
                  public void onClick(View v) {
                      Intent intent = new Intent();
                      // Picture from camera
                      intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
  
                      // This is not the right way to do this, but for some reason, having
                      // it store it in
                      // MediaStore.Images.Media.EXTERNAL_CONTENT_URI isn't working right.
  
                      Date date = new Date();
                      DateFormat df = new SimpleDateFormat("yyyy-MM-dd-kk-mm-ss");
  
                      String newPicFile = df.format(date) + ".jpg";
                      String outPath = new File(Environment.getExternalStorageDirectory(), newPicFile).getPath();
                      File outFile = new File(outPath);
  
                      mCameraFileName = outFile.toString();
                      Uri outuri = Uri.fromFile(outFile);
                      intent.putExtra(MediaStore.EXTRA_OUTPUT, outuri);
                      Log.i(TAG, "Importing New Picture: " + mCameraFileName);
                      try {
                          startActivityForResult(intent, NEW_PICTURE);
                      } catch (ActivityNotFoundException e) {
                          showToast("There doesn't seem to be a camera.");
                      }
                  }
              });
  
  
              // This is the button to take a photo
              mRoulette = (Button)findViewById(R.id.roulette_button);
  
              mRoulette.setOnClickListener(new OnClickListener() {
                  public void onClick(View v) {
                      DownloadRandomPicture download = new DownloadRandomPicture(DBRoulette.this, mApi, PHOTO_DIR, mImage);
                      download.execute();
                  }
              });
  
              // Display the proper UI state if logged in or not
              setLoggedIn(mApi.getSession().isLinked());
  
          }
  
          @Override
          protected void onSaveInstanceState(Bundle outState) {
              outState.putString("mCameraFileName", mCameraFileName);
              super.onSaveInstanceState(outState);
          }
  
          @Override
          protected void onResume() {
              super.onResume();
              AndroidAuthSession session = mApi.getSession();
  
              // The next part must be inserted in the onResume() method of the
              // activity from which session.startAuthentication() was called, so
              // that Dropbox authentication completes properly.
              if (session.authenticationSuccessful()) {
                  try {
                      // Mandatory call to complete the auth
                      session.finishAuthentication();
  
                      // Store it locally in our app for later use
                      storeAuth(session);
                      setLoggedIn(true);
                  } catch (IllegalStateException e) {
                      showToast("Couldn't authenticate with Dropbox:" + e.getLocalizedMessage());
                      Log.i(TAG, "Error authenticating", e);
                  }
              }
          }
  
          // This is what gets called on finishing a media piece to import
          @Override
          public void onActivityResult(int requestCode, int resultCode, Intent data) {
              if (requestCode == NEW_PICTURE) {
                  // return from file upload
                  if (resultCode == Activity.RESULT_OK) {
                      Uri uri = null;
                      if (data != null) {
                          uri = data.getData();
                      }
                      if (uri == null &amp;&amp; mCameraFileName != null) {
                          uri = Uri.fromFile(new File(mCameraFileName));
                      }
                      File file = new File(mCameraFileName);
  
                      if (uri != null) {
                          UploadPicture upload = new UploadPicture(this, mApi, PHOTO_DIR, file);
                          upload.execute();
                      }
                  } else {
                      Log.w(TAG, "Unknown Activity Result from mediaImport: "
                              + resultCode);
                  }
              }
          }
  
          private void logOut() {
              // Remove credentials from the session
              mApi.getSession().unlink();
  
              // Clear our stored keys
              clearKeys();
              // Change UI state to display logged out version
              setLoggedIn(false);
          }
  
          /**
           * Convenience function to change UI state based on being logged in
           */
          private void setLoggedIn(boolean loggedIn) {
              mLoggedIn = loggedIn;
              if (loggedIn) {
                  mSubmit.setText("Unlink from Dropbox");
                  mDisplay.setVisibility(View.VISIBLE);
              } else {
                  mSubmit.setText("Link with Dropbox");
                  mDisplay.setVisibility(View.GONE);
                  mImage.setImageDrawable(null);
              }
          }
  
          private void checkAppKeySetup() {
              // Check to make sure that we have a valid app key
              if (APP_KEY.startsWith("CHANGE") ||
                      APP_SECRET.startsWith("CHANGE")) {
                  showToast("You must apply for an app key and secret from developers.dropbox.com, and add them to the DBRoulette ap before trying it.");
                  finish();
                  return;
              }
  
              // Check if the app has set up its manifest properly.
              Intent testIntent = new Intent(Intent.ACTION_VIEW);
              String scheme = "db-" + APP_KEY;
              String uri = scheme + "://" + AuthActivity.AUTH_VERSION + "/test";
              testIntent.setData(Uri.parse(uri));
              PackageManager pm = getPackageManager();
              if (0 == pm.queryIntentActivities(testIntent, 0).size()) {
                  showToast("URL scheme in your app's " +
                          "manifest is not set up correctly. You should have a " +
                          "com.dropbox.client2.android.AuthActivity with the " +
                          "scheme: " + scheme);
                  finish();
              }
          }
  
          private void showToast(String msg) {
              Toast error = Toast.makeText(this, msg, Toast.LENGTH_LONG);
              error.show();
          }
  
          /**
           * Shows keeping the access keys returned from Trusted Authenticator in a local
           * store, rather than storing user name &amp; password, and re-authenticating each
           * time (which is not to be done, ever).
           */
          private void loadAuth(AndroidAuthSession session) {
              SharedPreferences prefs = getSharedPreferences(ACCOUNT_PREFS_NAME, 0);
              String key = prefs.getString(ACCESS_KEY_NAME, null);
              String secret = prefs.getString(ACCESS_SECRET_NAME, null);
              if (key == null || secret == null || key.length() == 0 || secret.length() == 0) return;
  
              if (key.equals("oauth2:")) {
                  // If the key is set to "oauth2:", then we can assume the token is for OAuth 2.
                  session.setOAuth2AccessToken(secret);
              } else {
                  // Still support using old OAuth 1 tokens.
                  session.setAccessTokenPair(new AccessTokenPair(key, secret));
              }
          }
  
          /**
           * Shows keeping the access keys returned from Trusted Authenticator in a local
           * store, rather than storing user name &amp; password, and re-authenticating each
           * time (which is not to be done, ever).
           */
          private void storeAuth(AndroidAuthSession session) {
              // Store the OAuth 2 access token, if there is one.
              String oauth2AccessToken = session.getOAuth2AccessToken();
              if (oauth2AccessToken != null) {
                  SharedPreferences prefs = getSharedPreferences(ACCOUNT_PREFS_NAME, 0);
                  Editor edit = prefs.edit();
                  edit.putString(ACCESS_KEY_NAME, "oauth2:");
                  edit.putString(ACCESS_SECRET_NAME, oauth2AccessToken);
                  edit.commit();
                  return;
              }
              // Store the OAuth 1 access token, if there is one.  This is only necessary if
              // you're still using OAuth 1.
              AccessTokenPair oauth1AccessToken = session.getAccessTokenPair();
              if (oauth1AccessToken != null) {
                  SharedPreferences prefs = getSharedPreferences(ACCOUNT_PREFS_NAME, 0);
                  Editor edit = prefs.edit();
                  edit.putString(ACCESS_KEY_NAME, oauth1AccessToken.key);
                  edit.putString(ACCESS_SECRET_NAME, oauth1AccessToken.secret);
                  edit.commit();
                  return;
              }
          }
  
          private void clearKeys() {
              SharedPreferences prefs = getSharedPreferences(ACCOUNT_PREFS_NAME, 0);
              Editor edit = prefs.edit();
              edit.clear();
              edit.commit();
          }
  
          private AndroidAuthSession buildSession() {
              AppKeyPair appKeyPair = new AppKeyPair(APP_KEY, APP_SECRET);
  
              AndroidAuthSession session = new AndroidAuthSession(appKeyPair);
              loadAuth(session);
              return session;
          }
      }
      `
  </code></pre>