com.dropbox.client2.exception.DropboxUnlinkedException

Я хочу отправить текстовый файл в Dropbox, но он показывает DropboxUnlinkedException.

Решение ::

Во-первых, позвольте вашей программе полностью аутентифицироваться. Сразу после метода mDBApi.getSession.startAuthentication() автоматически будет вызван метод onResume. Позвольте полной аутентификации завершиться, а затем делайте то, что хотите.

Основное действие

public class MainActivity extends Activity implements LocationListener{

TextView date;
TextView lati;
TextView longi;
Button b1;
private DropboxAPI<AndroidAuthSession> mDBApi;
private LocationManager locationManager;
private String provider;

final static public String ACCOUNT_PREFS_NAME = "GPS_File";
final static public String APP_KEY = "5qiq4z06ikagxfb";
final static public String APP_SECRET = "f6mbf1hnn0re2ni";
final static public AccessType ACCESS_TYPE = AccessType.APP_FOLDER;

boolean mIsLoggedIn = false;

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

    AppKeyPair appKeys = new AppKeyPair(APP_KEY, APP_SECRET);
    AndroidAuthSession session = new AndroidAuthSession(appKeys, ACCESS_TYPE);
    mDBApi = new DropboxAPI<AndroidAuthSession>(session);

 //this is start authentication     
   mDBApi.getSession().startAuthentication(MainActivity.this);
 //after this it will call onResume 

    date = (TextView)findViewById(R.id.textView2);
    lati = (TextView)findViewById(R.id.textView4);
    longi = (TextView)findViewById(R.id.textView6);
    b1 = (Button)findViewById(R.id.button1);

    createFile("abcd", "12345", "54321");
    toDropbox();

    setLoggedIn(mDBApi.getSession().isLinked());
}

void createFile(String str1,String str2,String str3)
{
    String data = str1+"\t"+str2+"\t"+str3;
    try{
        File myFile = new File("/sdcard/DropboxFile1.txt");
        myFile.createNewFile();
        FileOutputStream fOut = new FileOutputStream(myFile);
        OutputStreamWriter myOutWriter = new OutputStreamWriter(fOut);
      myOutWriter.append(data);
      myOutWriter.close();
      fOut.close();
        }
        catch(Exception e)
        {e.printStackTrace();}
}


void toDropbox()
{
    b1.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub
            String filePath = Environment.getExternalStorageDirectory().getAbsolutePath().toString() + "/DropboxFile1.txt";
            File file = new File(filePath);

            mDBApi.getSession().startAuthentication(MainActivity.this);

            try {

                mDBApi.putFileOverwrite(filePath, new FileInputStream(file), file.length(), null);

            } catch (DropboxException e) {
                e.printStackTrace();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
        }
    });
}

private void clearKeys() {
    SharedPreferences prefs = getSharedPreferences(ACCOUNT_PREFS_NAME, 0);
    Editor edit = prefs.edit();
    edit.clear();
    edit.commit();
}

//This get call after StartAuthentication..
protected void onResume() {
    super.onResume();
    AndroidAuthSession session = mDBApi.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
            TokenPair tokens = session.getAccessTokenPair();
            storeKeys(tokens.key, tokens.secret);
            setLoggedIn(true);
        } catch (IllegalStateException e) {
//Keep this toast.. It will show you the completed authentication..
            Toast.makeText(getBaseContext(), e.getLocalizedMessage(), Toast.LENGTH_SHORT).show();
            Log.i("Dropbox", "Error authenticating", e);
        }
    }
}    

private void storeKeys(String key, String secret) {
    // Save the access key for later
    SharedPreferences prefs = getSharedPreferences(ACCOUNT_PREFS_NAME, 0);
    Editor edit = prefs.edit();
    edit.putString(APP_KEY, key);
    edit.putString(APP_SECRET, secret);
    edit.commit();
}
public void setLoggedIn(boolean loggedIn) {
    mIsLoggedIn = loggedIn;
}
public boolean isLoggedIn() {
    return mIsLoggedIn;
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}
@Override
public void onProviderDisabled(String arg0) {
    // TODO Auto-generated method stub
}
@Override
public void onProviderEnabled(String arg0) {
    // TODO Auto-generated method stub
}
@Override
public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
    // TODO Auto-generated method stub
}
}//MainActivity Ends..`

` После завершения аутентификации займитесь другими делами.


person Lalit    schedule 26.12.2013    source источник
comment
newFile, похоже, содержит дополнительную фигурную скобку, так что, по-видимому, этот код даже не скомпилируется. И почему вы не дадите нам полную трассировку стека исключения? Вы даже не сказали нам, какая строка вашего кода вызывает исключение. Вы также не сказали мне, что вы сделали в приложении, чтобы вызвать исключение. (Я предполагаю, что было задействовано как минимум одно нажатие кнопки, и возможно вы вошли в систему первым...)   -  person user94559    schedule 26.12.2013
comment
Извините за это, сэр. Теперь я внес все изменения, пожалуйста, проверьте это. и этот newFile '{' был сделан ошибочно. благодарю вас. ( ',' ) @smarx   -  person Lalit    schedule 26.12.2013
comment
И еще, сэр, расскажите мне о процессе Создать приложение в Dropbox. Например, Приложение какого типа вы хотите создать? и следующие шаги. спасибо ( ',' ) @smarx   -  person Lalit    schedule 26.12.2013
comment
Насколько я могу судить, вы до сих пор не сказали нам, что вы на самом деле сделали в приложении, чтобы вызвать это исключение. Теперь мы можем видеть, что это вызвано вызовом обработчика вашей кнопки, поэтому я предполагаю, что вы нажали эту кнопку. Что вы делали до этого? Что сработало? Что не сделал? Что вы пробовали, когда отлаживали это? Можете ли вы воспроизвести ошибку с помощью небольшой программы? У вас работает пример в SDK? Это всегда терпит неудачу или иногда срабатывает? Вы искали сообщение об ошибке... может быть, в коде SDK?   -  person user94559    schedule 26.12.2013
comment
Сэр, см. MainActivity, теперь я упростил его. Сначала автоматически создается один файл, в котором есть что-то. и есть одна кнопка, поэтому после нажатия на эту кнопку файл должен быть отправлен, это мой девиз. Он работает до mDBApi.getSession().startAuthentication(MainActivity.this), после чего переходит на страницу входа в Dropbox, а затем приходит DropboxUnlinkedException в Logcat. Надеюсь, вы поймете, что я хочу сказать.   -  person Lalit    schedule 26.12.2013
comment
Кроме того, где вы используете mDBApi.putFileOverwrite(filePath Здесь, я думаю, должно быть просто имя файла. Это файл, который вы хотите заменить новым (в раскрывающемся списке). Так что, возможно, вместо использования полного пути к файлу из вашего телефон Android, просто используйте DropboxFile1.txt.   -  person ialexander    schedule 27.12.2013


Ответы (2)


Вы вызываете startAuthentication, но затем сразу же пытаетесь вызвать методы API (до фактической аутентификации). Вы можете использовать API только после аутентификации пользователя. В вашем коде вот часть, которая запускается после аутентификации пользователя и возврата в ваше приложение:

protected void onResume() {
    ...
    if (session.authenticationSuccessful()) {
        ...
person user94559    schedule 26.12.2013
comment
Okokk.. Тогда я сделаю одну вещь, я вызову метод onResume() после startAuthentication Верно, сэр? @smarx - person Lalit; 26.12.2013
comment
Нет, это неправильно. onResume автоматически вызывается при возобновлении работы вашего приложения. Таким образом, пользователь проходит аутентификацию в приложении Dropbox, и когда он возвращается в ваше приложение, вызывается onResume. Это просто концепция Android и не имеет ничего общего с Dropbox. - person user94559; 26.12.2013
comment
Спасибо, сэр. Теперь я полностью понимаю, как работает аутентификация. Но теперь у моего приложения другая проблема. 12-26 09:32:16.423: E/AndroidRuntime(1116): FATAL EXCEPTION: main 12-26 09:32:16.423: E/AndroidRuntime(1116): android.os.NetworkOnMainThreadException Что это значит. Что мне теперь делать для этого? @smarx - person Lalit; 26.12.2013
comment
Это не связанный с этим вопрос, и любая поисковая система должна довольно быстро сказать вам, что означает ошибка. - person user94559; 26.12.2013
comment
проверьте заголовок stackoverflow.com/questions/28428719/ - person Siddharth; 23.02.2015
comment
@Siddharth Если мой ответ неполный или неясный, объясните, почему. - person user94559; 23.02.2015

Эта ошибка также может возникнуть, если вы пропустили вызов этого в onResume() вашей активности:

                mDBApi.getSession().finishAuthentication();
person user2903200    schedule 20.03.2014