1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/wizardforcel-android-app-sec-guidebook

Клонировать/Скачать
5.5.1.md 16 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 27.11.2024 20:24 c13bfb7

Вот перевод текста на русский язык:

new SendDataAsyncTack().execute(SEND_DATA_URI, UserId, locationData, nickname); } } // Сохраняем статус согласия пользователя. // На самом деле необходимо получить согласие для каждого типа данных пользователя. SharedPreferences.Editor pref = getSharedPreferences(PRIVACY_POLICY_PREF_NAME, MODE_PRIVATE).edit(); pref.putInt(PRIVACY_POLICY_DISCRETE_TYPE1_AGREED_KEY, getVersionCode()); pref.apply(); } }

public void onNegativeButtonClick(int type) {
    if (type == DIALOG_TYPE_COMPREHENSIVE_AGREEMENT) {
        // *** ТОЧКА 2 *** Если пользователь не даёт общее согласие, не передавайте данные пользователя.
        // В этом примере приложения мы завершаем работу приложения в этом случае.
        finish();
    } else if (type == DIALOG_TYPE_PRE_CONFIRMATION) {
        // *** ТОЧКА 4 *** Если пользователь не дает конкретное согласие, не передавайте соответствующие данные.
        // Пользователь не дал согласия, поэтому мы ничего не делаем.
    }
}

private int getVersionCode() {
    int versionCode = -1;
    PackageManager packageManager = this.getPackageManager();
    try {
        PackageInfo packageInfo = packageManager.getPackageInfo(this.getPackageName(), PackageManager.GET_ACTIVITIES);
        versionCode = packageInfo.versionCode;
    } catch (NameNotFoundException e) {
        // Это пример, поэтому опускаем обработку исключений
    }
    return versionCode;
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.action_show_pp:
            // *** ТОЧКА 5 *** Предоставьте методы, с помощью которых пользователь может ознакомиться с политикой конфиденциальности приложения.
            Intent intent = new Intent();
            intent.setClass(this, WebViewAssetsActivity.class);
            startActivity(intent);
            return true;
        case R.id.action_del_id:
            // *** ТОЧКА 6 *** Предоставьте способы, которыми пользователь может удалить переданные данные.
            new SendDataAsyncTack().execute(DEL_ID_URI, UserId);
            return true;
        case R.id.action_donot_send_id:
            // *** ТОЧКА 7 *** Предоставьте методы, которые позволяют пользователю остановить передачу данных.
            // Если пользователь прекращает отправку данных, считается, что согласие пользователя было отозвано.
            SharedPreferences.Editor pref = getSharedPreferences(PRIVACY_POLICY_PREF_NAME, MODE_PRIVATE).edit();
            pref.putInt(PRIVACY_POLICY_COMPREHENSIVE_AGREED_KEY, 0);
            pref.apply();
            // В этом примере приложения, если данные пользователя не могут быть отправлены действиями пользователя,
            // завершите работу приложения, потому что мы ничего не делаем.
            String message = getString(R.string.stopSendUserData);
            Toast.makeText(MainActivity.this, this.getClass().getSimpleName() + " - " + message, Toast.LENGTH_SHORT).show();
            finish();
            return true;
    }
    return false;
}

@Override
public void onConnected(Bundle connectionHint) {
    if (mLocationClient != null && mLocationClient.isConnected()) {
        Location currentLocation = mLocationClient.getLastLocation();
        if (currentLocation != null) {
            String locationData = "Latitude ¥t: " + currentLocation.getLatitude() + "¥n¥tLongitude ¥t: " + currentLocation.getLongitude();
            String text = "¥n" + getString(R.string.your_location_title) + "¥n¥t" + locationData;
            TextView appText = (TextView) findViewById(R.id.appText);
            appText.setText(text);
        }
    }
}

@Override
public void onConnectionFailed(ConnectionResult result) {
    if (result.hasResolution()) { ```

try { result.startResolutionForResult(this, CONNECTION_FAILURE_RESOLUTION_REQUEST); } catch (IntentSender.SendIntentException e) { e.printStackTrace(); } }


Здесь происходит попытка запуска разрешения для результата с использованием метода `startResolutionForResult`. В случае возникновения исключения `IntentSender.SendIntentException` выполняется его печать в стандартный поток ошибок.

@Override public void onDisconnected() { mLocationClient = null; }


В этом фрагменте кода переопределяется метод `onDisconnected`, который устанавливает значение `null` для переменной `mLocationClient`.

private class GetDataAsyncTask extends AsyncTask<String, Void, String> {

private String extMessage = "";

@Override
protected String doInBackground(String... params) {
    // *** POINT 8 *** Use UUIDs or cookies to keep track of user data
    // In this sample we use an ID generated on the server side
    SharedPreferences sp = getSharedPreferences(PRIVACY_POLICY_PREF_NAME, MODE_PRIVATE);
    UserId = sp.getString(ID_KEY, null);
    if (UserId == null) {
        // No token in SharedPreferences; fetch ID from server
        try {
            UserId = NetworkUtil.getCookie(GET_ID_URI, "", "id");
        } catch (IOException e) {
            // Catch exceptions such as certification errors
            extMessage = e.toString();
        }
        // Store the fetched ID in SharedPreferences
        sp.edit().putString(ID_KEY, UserId).commit();
    }
    return UserId;
}

@Override
protected void onPostExecute(final String data) {
    String status = (data != null) ? "success" : "error";
    Toast.makeText(MainActivity.this, this.getClass().getSimpleName() + " - " + status + " : " +
        extMessage, Toast.LENGTH_SHORT).show();
}

}


Этот фрагмент кода определяет класс `GetDataAsyncTask`, который расширяет класс `AsyncTask`. Класс `GetDataAsyncTask` имеет метод `doInBackground`, который получает идентификатор пользователя из общих настроек или с сервера. Если идентификатор получен с сервера, он сохраняется в общих настройках. Метод `onPostExecute` отображает сообщение о результате выполнения задачи.

private class SendDataAsyncTack extends AsyncTask<String, Void, Boolean> {

private String extMessage = "";

@Override
protected Boolean doInBackground(String... params) {
    String url = params[0];
    String id = params[1];
    String location = params.length > 2 ? params[2] : null;
    String nickname = params.length > 3 ? params[3] : null;
    Boolean result = false;
    try {
        JSONObject jsonData = new JSONObject();
        jsonData.put(ID_KEY, id);
        if (location != null)
        jsonData.put(LOCATION_KEY, location);
        if (nickname != null)
        jsonData.put(NICK_NAME_KEY, nickname);
        NetworkUtil.sendJSON(url, "", jsonData.toString());
        result = true;
    } catch (IOException e) {
        // Catch exceptions such as certification errors
        extMessage = e.toString();
    } catch (JSONException e) {
        extMessage = e.toString();
    }
    return result;
}

@Override
protected void onPostExecute(Boolean result) {
    String status = result ? "Success" : "Error";
    Toast.makeText(MainActivity.this, this.getClass().getSimpleName() + " - " + status + " : " +
        extMessage, Toast.LENGTH_SHORT).show();
}

}


Класс `SendDataAsyncTack` также расширяет класс `AsyncTask` и выполняет отправку данных на сервер. В методе `doInBackground` данные упаковываются в JSON-объект и отправляются на сервер с помощью метода `NetworkUtil.sendJSON`. Результат выполнения задачи отображается в методе `onPostExecute`. Сохраните полученный ID в SharedPreferences:

sp.edit().putString(ID_KEY, UserId).commit();
}
return UserId;
}

@Override
protected void onPostExecute(final String data) {
    String status = (data != null) ? "успех" : "ошибка";
    Toast.makeText(MainActivity.this, this.getClass().getSimpleName() + " - " + status + " : " +
        extMessage, Toast.LENGTH_SHORT).show();
}
}

private class SendDataAsyncTack extends AsyncTask<String, Void, Boolean> {

    private String extMessage = "";

    @Override
    protected Boolean doInBackground(String... params) {

        String url = params[0];
        String id = params[1];
        String nickname = params.length > 2 ? params[2] : null;
        String imei = params.length > 3 ? params[3] : null;
        Boolean result = false;
        try {
            JSONObject jsonData = new JSONObject();
            jsonData.put(ID_KEY, id);
            if (nickname != null)
                jsonData.put(NICK_NAME_KEY, nickname);
            if (imei != null)
                jsonData.put(IMEI_KEY, imei);
            NetworkUtil.sendJSON(url, "", jsonData.toString());
            result = true;
        } catch (IOException e) {
            // Catch exceptions such as certification errors
            extMessage = e.toString();
        } catch (JSONException e) {
            extMessage = e.toString();
        }
        return result;
    }

    @Override
    protected void onPostExecute(Boolean result) {
        String status = result ? "Успех" : "Ошибка";
        Toast.makeText(MainActivity.this, this.getClass().getSimpleName() + " - " + status + " : " +
            extMessage, Toast.LENGTH_SHORT).show();
    }
}

ConfirmFragment.java

package org.jssec.android.privacypolicynopreconfirm;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;

public class ConfirmFragment extends DialogFragment {

    private DialogListener mListener = null;

    public static interface DialogListener {
        public void onPositiveButtonClick(int type);
        public void onNegativeButtonClick(int type);
    }

    public static ConfirmFragment newInstance(int title, int sentence, int type) {
        ConfirmFragment fragment = new ConfirmFragment();
        Bundle args = new Bundle();
        args.putInt("title", title);
        args.putInt("sentence", sentence);
        args.putInt("type", type);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public Dialog onCreateDialog(Bundle args) {
        // *** POINT 1 *** On first launch (or application update), obtain broad consent to transmit user data that will be handled by the application.
        final int title = getArguments().getInt("title");
        final int sentence = getArguments().getInt("sentence");
        final int type = getArguments().getInt("type");
        LayoutInflater inflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View content = inflater.inflate(R.layout.fragment_comfirm, null);
        TextView linkPP = (TextView) content.findViewById(R.id.tx_link_pp);
        linkPP.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // *** POINT 3 *** Provide methods by which the user can review the application privacy policy.
                Intent intent = new Intent();
                intent.setClass(getActivity(), WebViewAssetsActivity.class);

``` **Текст 1:**

params[1];
String nickname = params.length > 2 ? params[2] : null;
Boolean result = false;
try {
    JSONObject jsonData = new JSONObject();
    jsonData.put(ID_KEY, id);
    if (nickname != null)
        jsonData.put(NICK_NAME_KEY, nickname);
    NetworkUtil.sendJSON(url, "", jsonData.toString());
    result = true;
} catch (IOException e) {
    // Catch exceptions such as certification errors
    extMessage = e.toString();
} catch (JSONException e) {
    extMessage = e.toString();
}
return result;

**Текст 2:**

WebViewAssetsActivity.java

package org.jssec.android.privacypolicynocomprehensive; import org.jssec.android.privacypolicynocomprehensive.R; import android.app.Activity; import android.os.Bundle; import android.webkit.WebSettings; import android.webkit.WebView; public class WebViewAssetsActivity extends Activity { // *** POINT 5 *** Place a summary version of the application privacy policy in the assets folder private static final String ABST_PP_URL = "file:///android_asset/PrivacyPolicy/app-policy-abst-privacypolicy-1.0.html"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_webview); WebView webView = (WebView) findViewById(R.id.webView); WebSettings webSettings = webView.getSettings(); webSettings.setAllowFileAccess(false); webView.loadUrl(ABST_PP_URL); } }

Текст 3:

MainActivity.java

package org.jssec.android.privacypolicynoinfosent;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesClient;
import com.google.android.gms.location.LocationClient;
import android.location.Location;
import android.net.Uri;
import android.os.Bundle;
import android.content.Intent;
import android.content.IntentSender;
import android.support.v4.app.FragmentActivity;
import android.view.Menu;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends FragmentActivity implements GooglePlayServicesClient.ConnectionCallbacks,
GooglePlayServicesClient.OnConnectionFailedListener {
private LocationClient mLocationClient = null;
private final int CONNECTION_FAILURE_RESOLUTION_REQUEST = 257;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mLocationClient = new LocationClient(this, this, this);
}
@Override
protected void onStart() {
super.onStart();
// Used to obtain location data
if (mLocationClient != null) {
mLocationClient.connect();
}
}
@Override
protected void onStop() {
if (mLocationClient != null) {
mLocationClient.disconnect();
}
super.onStop();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
public void onStartMap(View view) {
// *** POINT 1 *** You do not need to display an application privacy policy if your application w
ill only use the information it obtains within the device.
if (mLocationClient != null && mLocationClient.isConnected()) {
Location currentLocation = mLocationClient.getLastLocation();
if

*В запросе присутствуют фрагменты кода на языке Java, но в них нет фрагментов, требующих перевода.*

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/wizardforcel-android-app-sec-guidebook.git
git@api.gitlife.ru:oschina-mirror/wizardforcel-android-app-sec-guidebook.git
oschina-mirror
wizardforcel-android-app-sec-guidebook
wizardforcel-android-app-sec-guidebook
master