如何在我的android应用程序中登录google帐户,而不将该帐户添加到设备中

如何在我的android应用程序中登录google帐户,而不将该帐户添加到设备中,android,google-drive-api,google-drive-android-api,Android,Google Drive Api,Google Drive Android Api,我正在创建一个android应用程序,它应该可以访问google drive帐户,以便在google drive中存储和读取文件。为此,我使用了谷歌驱动android API。但问题是,当用户通过应用程序登录到该帐户时,该帐户也会添加到设备中,并且可以通过驱动器、gmail等访问该帐户,。。。应用程序和我需要限制只有我的应用程序才能访问该google帐户 是否有限制谷歌账户访问权限仅限于我的应用程序 我在下面展示了一些与连接到google drive相关的代码: public class Mai

我正在创建一个android应用程序,它应该可以访问google drive帐户,以便在google drive中存储和读取文件。为此,我使用了谷歌驱动android API。但问题是,当用户通过应用程序登录到该帐户时,该帐户也会添加到设备中,并且可以通过驱动器、gmail等访问该帐户,。。。应用程序和我需要限制只有我的应用程序才能访问该google帐户

是否有限制谷歌账户访问权限仅限于我的应用程序

我在下面展示了一些与连接到google drive相关的代码:

public class MainActivity extends Activity implements ConnectionCallbacks, OnConnectionFailedListener {
    private GoogleApiClient mGoogleApiClient;
    // Request code to use when launching the resolution activity
    private static final int REQUEST_RESOLVE_ERROR = 1001;
    private boolean mResolvingError = false;
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == REQUEST_RESOLVE_ERROR) {
        mResolvingError = false;
        if (resultCode == RESULT_OK) {
            // Make sure the app is not already connected or attempting to connect
            if (!mGoogleApiClient.isConnecting() &&
                    !mGoogleApiClient.isConnected()) {
                mGoogleApiClient.connect();
            }
        }
    }
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);
        //start connection to google play 
        mGoogleApiClient = new GoogleApiClient.Builder(this)
        .addApi(Drive.API)
        .addScope(Drive.SCOPE_FILE)
        .addConnectionCallbacks(this)
        .addOnConnectionFailedListener(this)
        .build();

    }
    @Override
    public void onConnectionFailed(ConnectionResult result) {
        // TODO Auto-generated method stub
        if (mResolvingError) {
            // Already attempting to resolve an error.
            return;
        } else if (result.hasResolution()) {
            try {
                mResolvingError = true;
                result.startResolutionForResult(this,REQUEST_RESOLVE_ERROR);
            } catch (SendIntentException e) {
                // There was an error with the resolution intent. Try again.
                mGoogleApiClient.connect();
            }
         } else {
            // Show dialog using GooglePlayServicesUtil.getErrorDialog()
            showErrorDialog(result.getErrorCode());
            mResolvingError = true;
         }
    }

    @Override
    public void onConnected(Bundle arg0) {
        // TODO Auto-generated method stub
        showMessage("Connected to account");
    }

    protected void onPause()
    {
        showMessage("onPause");
        super.onPause();

    }

    protected void onStart() {
        super.onStart();
        showMessage("onStart");
        if (!mResolvingError && !mGoogleApiClient.isConnected()) {  // more about this later
            mGoogleApiClient.connect();
        }
    }

    @Override
    protected void onStop() {
        showMessage("OnStop");
        //mGoogleApiClient.disconnect();
        super.onStop();
    }

    protected void onRestart()
    {
        showMessage("onRestart");
        super.onRestart();
        if (!mResolvingError  && !mGoogleApiClient.isConnected()) {  // more about this later
            mGoogleApiClient.connect();
        }
    }
     public void showMessage(String message) {
        Toast.makeText(this, message, Toast.LENGTH_LONG).show();
    }

}
事实上,我正在制作一个应用程序,我们使用它来收集用户的数据,因此我们希望数据存储在一个中央存储空间中,我们和应用程序的其他用户都可以访问数据(用户通过我们的应用程序访问数据的权限有限)。我们对dropbox也做了同样的操作,效果很好。但由于用户访问dropbox时受到一些限制,我正在寻找其他解决方案。现在,我正试图用谷歌硬盘做同样的事情。 有没有人能解决我该怎么做的问题


事实上,google帐户与应用程序的用户无关,它是我的google帐户,应用程序中的数据应该存储在该帐户中。

我不能说我完全理解你的问题,但我会尽力帮助你

你可能知道,你的应用程序需要升级

假设这是工作,你需要有效的gmail帐户访问驱动器。在正常情况下,您会从设备上的一组帐户中提取gmail帐户,即。myaccount@gmail, youraccount@gmail, .... 这些帐户的列表在设置中可见,您通常通过设置添加/删除它们,或者您的应用程序可以通过调用AccountPicker来完成。我有一个处理这个问题的方法(遵循MainActivity-REQ_ACCPICK-GDAA分支)。AccountPicker/设置从列表中选择一个帐户,或向设备添加一个新帐户

现在,让我们假设您希望使用不在设备列表中的gmail帐户访问驱动器(即,非登录)-LIST@GMAIL.COM),绕过帐户选择器,并将其直接粘贴到():

如果执行此操作,将在“onConnectionFailed()”中获得“无效帐户”。这是有道理的,因为您刚刚设置了一个设备不知道的帐户名-即使不知道它的密码也有效。我想这将是谷歌硬盘安全的一个主要问题,对吗

因此,结论(或我的最佳猜测)是:除非您可以将帐户/密码信息“硬编码”到GoogleapClient builder中,否则获得驱动器连接的唯一方法是使用其中一个“注册”帐户-他们已经拥有正确的密码

更新:

可能有不同的方法来实现它。同样,未经测试。我会尝试使用一个“主管”谷歌帐户,并与用户共享文件。驱动器作用域下的Android REST Api应该能够访问这些共享文件/文件夹。这样,用户可以使用自己的帐户访问“主管”文件(我隐约记得在玩RESTAPI时点击了“与我共享”文件)。很长一段时间,但是可以使用页面底部的-来轻松测试它。我甚至会在GDAA下检验同样的假设。我不知道GDAA是否能看到文件作用域下的“共享文件”


祝你好运

我也遇到了同样的问题,在进行了大量研究并阅读了许多愤怒用户关于此“功能”的帖子后,我的印象是,使用GoogleAppClient无法做到这一点

相反,我用于检索authCode/令牌,然后将该令牌与一起用于检索用户文件

请注意,从2017年4月20日起,谷歌不再支持WebView OAuth,这就是我建议AppAuth的原因。AppAuth还处理其他不愉快的事情,例如

您可以在此处找到有关此方法的更多详细信息以及奇怪的授权错误的解决方法:


希望这能有所帮助。

展示一些您迄今为止尝试过的代码。您找到解决方案了吗?我也有同样的问题-在android上使用GoogleDrive而不将帐户添加到设备中。实际上,我的问题是,我不想将我登录的帐户添加到设备中的注册帐户中。因为用户与此帐户无关。这个帐户只是用来将数据存储在一个谷歌帐户的驱动器中。我猜这是不可能的,但我更了解帐户管理,所以可能还有人可以帮助你。尝试查找与Android Google帐户管理相关的标签。我必须问一个问题,是否可以在我的Android应用程序中硬编码任何gmail帐户,并且任何使用我的应用程序的人都可以将文档上载到Google drive?我遇到了appauth无法工作的问题,这取决于用户设备上的浏览器。此外,appauth还不是1.0,多年来几乎没有受到关注。它有漏洞,而且无法修复。
mGoogleApiClient = new GoogleApiClient.Builder(this)
        .addApi(Drive.API)
        .addScope(Drive.SCOPE_FILE)
        .addConnectionCallbacks(this)
        .addOnConnectionFailedListener(this)
        .setAccountName("NOT-IN-LIST@GMAIL.COM")
        .build();