From c80265a39797463e86541c5f402ef380095c21e9 Mon Sep 17 00:00:00 2001 From: 305zhengzesheng <1342561947@qq.com> Date: Fri, 17 May 2019 20:33:29 +0800 Subject: [PATCH 1/2] =?UTF-8?q?#7=20#305zhengzesheng=E7=AC=AC777=E6=AC=A1?= =?UTF-8?q?=E5=AE=9E=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../soft1714080902305/SecondActivity.java | 391 ++++++++++++++++++ 1 file changed, 391 insertions(+) create mode 100644 students/soft1714080902305/SecondActivity.java diff --git a/students/soft1714080902305/SecondActivity.java b/students/soft1714080902305/SecondActivity.java new file mode 100644 index 000000000..2cd0c76b3 --- /dev/null +++ b/students/soft1714080902305/SecondActivity.java @@ -0,0 +1,391 @@ +package edu.hzuapps.androidlabs.soft1714080902305; + +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.annotation.TargetApi; +import android.content.BroadcastReceiver; +import android.content.ComponentName; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.pm.PackageManager; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; +import android.support.annotation.NonNull; +import android.support.design.widget.Snackbar; +import android.support.v7.app.AlertDialog; +import android.support.v7.app.AppCompatActivity; +import android.app.LoaderManager.LoaderCallbacks; + +import android.content.CursorLoader; +import android.content.Loader; +import android.database.Cursor; +import android.net.Uri; +import android.os.AsyncTask; + +import android.os.Build; +import android.os.Bundle; +import android.provider.ContactsContract; +import android.text.TextUtils; +import android.view.KeyEvent; +import android.view.View; +import android.view.View.OnClickListener; +import android.view.inputmethod.EditorInfo; +import android.widget.ArrayAdapter; +import android.widget.AutoCompleteTextView; +import android.widget.Button; +import android.widget.EditText; +import android.widget.TextView; +import android.widget.Toast; + +import java.util.ArrayList; +import java.util.List; + +import static android.Manifest.permission.READ_CONTACTS; +import static android.net.ConnectivityManager.TYPE_WIFI; +import static android.provider.ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE; + +/** + * A login screen that offers login via email/password. + */ +public class SecondActivity extends AppCompatActivity implements LoaderCallbacks { + + /** + * Id to identity READ_CONTACTS permission request. + */ + private static final int REQUEST_READ_CONTACTS = 0; + + /** + * A dummy authentication store containing known user names and passwords. + * TODO: remove after connecting to a real authentication system. + */ + private static final String[] DUMMY_CREDENTIALS = new String[]{ + "foo@example.com:hello", "bar@example.com:world" + }; + /** + * Keep track of the login task to ensure we can cancel it if requested. + */ + private UserLoginTask mAuthTask = null; + + // UI references. + private AutoCompleteTextView mEmailView; + private EditText mPasswordView; + private View mProgressView; + private View mLoginFormView; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_second); + // Set up the login form. + mEmailView = (AutoCompleteTextView) findViewById(R.id.email); + populateAutoComplete(); + + mPasswordView = (EditText) findViewById(R.id.password); + mPasswordView.setOnEditorActionListener(new TextView.OnEditorActionListener() { + @Override + public boolean onEditorAction(TextView textView, int id, KeyEvent keyEvent) { + if (id == EditorInfo.IME_ACTION_DONE || id == EditorInfo.IME_NULL) { + attemptLogin(); + return true; + } + return false; + } + }); + + Button mEmailSignInButton = (Button) findViewById(R.id.email_sign_in_button); + mEmailSignInButton.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View view) { + attemptLogin(); + } + }); + + mLoginFormView = findViewById(R.id.login_form); + mProgressView = findViewById(R.id.login_progress); + } + + private void populateAutoComplete() { + if (!mayRequestContacts()) { + return; + } + + getLoaderManager().initLoader(0, null, this); + } + + private boolean mayRequestContacts() { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { + return true; + } + if (checkSelfPermission(READ_CONTACTS) == PackageManager.PERMISSION_GRANTED) { + return true; + } + if (shouldShowRequestPermissionRationale(READ_CONTACTS)) { + Snackbar.make(mEmailView, R.string.permission_rationale, Snackbar.LENGTH_INDEFINITE) + .setAction(android.R.string.ok, new View.OnClickListener() { + @Override + @TargetApi(Build.VERSION_CODES.M) + public void onClick(View v) { + requestPermissions(new String[]{READ_CONTACTS}, REQUEST_READ_CONTACTS); + } + }); + } else { + requestPermissions(new String[]{READ_CONTACTS}, REQUEST_READ_CONTACTS); + } + return false; + } + + /** + * Callback received when a permissions request has been completed. + */ + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, + @NonNull int[] grantResults) { + if (requestCode == REQUEST_READ_CONTACTS) { + if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + populateAutoComplete(); + } + } + } + + + /** + * Attempts to sign in or register the account specified by the login form. + * If there are form errors (invalid email, missing fields, etc.), the + * errors are presented and no actual login attempt is made. + */ + private void attemptLogin() { + if (mAuthTask != null) { + return; + } + + // Reset errors. + mEmailView.setError(null); + mPasswordView.setError(null); + + // Store values at the time of the login attempt. + String email = mEmailView.getText().toString(); + String password = mPasswordView.getText().toString(); + + boolean cancel = false; + View focusView = null; + + // Check for a valid password, if the user entered one. + if (!TextUtils.isEmpty(password) && !isPasswordValid(password)) { + mPasswordView.setError(getString(R.string.error_invalid_password)); + focusView = mPasswordView; + cancel = true; + } + + // Check for a valid email address. + if (TextUtils.isEmpty(email)) { + mEmailView.setError(getString(R.string.error_field_required)); + focusView = mEmailView; + cancel = true; + } else if (!isEmailValid(email)) { + mEmailView.setError(getString(R.string.error_invalid_email)); + focusView = mEmailView; + cancel = true; + } + + if (cancel) { + // There was an error; don't attempt login and focus the first + // form field with an error. + focusView.requestFocus(); + } else { + // Show a progress spinner, and kick off a background task to + // perform the user login attempt. + showProgress(true); + mAuthTask = new UserLoginTask(email, password); + mAuthTask.execute((Void) null); + } + } + + private boolean isEmailValid(String email) { + //TODO: Replace this with your own logic + return email.contains("@"); + } + + private boolean isPasswordValid(String password) { + //TODO: Replace this with your own logic + return password.length() > 4; + } + + /** + * Shows the progress UI and hides the login form. + */ + @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2) + private void showProgress(final boolean show) { + // On Honeycomb MR2 we have the ViewPropertyAnimator APIs, which allow + // for very easy animations. If available, use these APIs to fade-in + // the progress spinner. + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) { + int shortAnimTime = getResources().getInteger(android.R.integer.config_shortAnimTime); + + mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE); + mLoginFormView.animate().setDuration(shortAnimTime).alpha( + show ? 0 : 1).setListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE); + } + }); + + mProgressView.setVisibility(show ? View.VISIBLE : View.GONE); + mProgressView.animate().setDuration(shortAnimTime).alpha( + show ? 1 : 0).setListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + mProgressView.setVisibility(show ? View.VISIBLE : View.GONE); + } + }); + } else { + // The ViewPropertyAnimator APIs are not available, so simply show + // and hide the relevant UI components. + mProgressView.setVisibility(show ? View.VISIBLE : View.GONE); + mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE); + } + } + + @Override + public Loader onCreateLoader(int i, Bundle bundle) { + return new CursorLoader(this, + // Retrieve data rows for the device user's 'profile' contact. + Uri.withAppendedPath(ContactsContract.Profile.CONTENT_URI, + ContactsContract.Contacts.Data.CONTENT_DIRECTORY), ProfileQuery.PROJECTION, + + // Select only email addresses. + ContactsContract.Contacts.Data.MIMETYPE + + " = ?", new String[]{ContactsContract.CommonDataKinds.Email + .CONTENT_ITEM_TYPE}, + + // Show primary email addresses first. Note that there won't be + // a primary email address if the user hasn't specified one. + ContactsContract.Contacts.Data.IS_PRIMARY + " DESC"); + } + + @Override + public void onLoadFinished(Loader cursorLoader, Cursor cursor) { + List emails = new ArrayList<>(); + cursor.moveToFirst(); + while (!cursor.isAfterLast()) { + emails.add(cursor.getString(ProfileQuery.ADDRESS)); + cursor.moveToNext(); + } + + addEmailsToAutoComplete(emails); + } + + @Override + public void onLoaderReset(Loader cursorLoader) { + + } + + private void addEmailsToAutoComplete(List emailAddressCollection) { + //Create adapter to tell the AutoCompleteTextView what to show in its dropdown list. + ArrayAdapter adapter = + new ArrayAdapter<>(SecondActivity.this, + android.R.layout.simple_dropdown_item_1line, emailAddressCollection); + + mEmailView.setAdapter(adapter); + } + + + private interface ProfileQuery { + String[] PROJECTION = { + ContactsContract.CommonDataKinds.Email.ADDRESS, + ContactsContract.CommonDataKinds.Email.IS_PRIMARY, + }; + + int ADDRESS = 0; + int IS_PRIMARY = 1; + } + + /** + * Represents an asynchronous login/registration task used to authenticate + * the user. + */ + public class UserLoginTask extends AsyncTask { + + private final String mEmail; + private final String mPassword; + + UserLoginTask(String email, String password) { + mEmail = email; + mPassword = password; + } + + @Override + protected Boolean doInBackground(Void... params) { + // TODO: attempt authentication against a network service. + + try { + // Simulate network access. + Thread.sleep(2000); + } catch (InterruptedException e) { + return false; + } + + for (String credential : DUMMY_CREDENTIALS) { + String[] pieces = credential.split(":"); + if (pieces[0].equals(mEmail)) { + // Account exists, return true if the password matches. + return pieces[1].equals(mPassword); + } + } + + // TODO: register the new account here. + return true; + } + + @Override + protected void onPostExecute(final Boolean success) { + mAuthTask = null; + showProgress(false); + + if (success) { + finish(); + } else { + mPasswordView.setError(getString(R.string.error_incorrect_password)); + mPasswordView.requestFocus(); + } + } + + @Override + protected void onCancelled() { + mAuthTask = null; + showProgress(false); + } + } + + private boolean goToNetWork() { + // TODO Auto-generated method stub + ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); + NetworkInfo info = connectivityManager.getActiveNetworkInfo(); + if (info == null || !info.isAvailable()) { + new AlertDialog.Builder(this).setTitle("提醒:").setMessage("抱歉,目前无法连接网络。\n请检查您的手机网络连接!").setPositiveButton("打开网络设置", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + // TODO Auto-generated method stub + Intent intent = null; + //判断手机系统的版本 即API大于10 就是3.0或以上版本 + if (android.os.Build.VERSION.SDK_INT > 10) { + intent = new Intent(android.provider.Settings.ACTION_WIRELESS_SETTINGS); + } else { + intent = new Intent(); + ComponentName component = new ComponentName("com.android.settings", "com.android.settings.WirelessSettings"); + intent.setComponent(component); + intent.setAction("android.intent.action.VIEW"); + } + startActivity(intent); + } + }).setNegativeButton("联知道了!", null).show(); + return false; + } else { + //new AlertDialog.Builder(this).setMessage("网络正常可以使用").setPositiveButton("Ok", null).show(); + return true; + } + } +} + From d7dcf54b069483369fda54bde543d57c810b91da Mon Sep 17 00:00:00 2001 From: 305zhengzesheng <1342561947@qq.com> Date: Fri, 17 May 2019 20:41:50 +0800 Subject: [PATCH 2/2] =?UTF-8?q?#7=20#305zhengzesheng=E7=AC=AC7=E6=AC=A1?= =?UTF-8?q?=E5=AE=9E=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Soft1714080902305Activity.java | 5 - .../app/src/main/1556119101(1).jpg | Bin 41299 -> 0 bytes .../app/src/main/AndroidManifest.xml | 42 --- .../app/src/main/Scan_Activity.java | 192 ---------- .../app/src/main/Soft1714080902305.java | 186 ---------- .../app/src/main/activity_scan_.xml | 21 -- .../thirdapp/src/main/AndroidManifest.xml | 31 -- .../soft1714080902305/SecondActivity.java | 350 ------------------ .../soft1714080902305/Soft1714080902305.java | 55 --- .../thirdapp/src/main/res/drawable/cha.jpg | Bin 11202 -> 0 bytes .../src/main/res/layout/activity_second.xml | 78 ---- .../res/layout/activity_soft1714080902305.xml | 40 -- .../thirdapp/src/main/res/values/strings.xml | 20 - 13 files changed, 1020 deletions(-) delete mode 100644 students/soft1714080902305/Soft1714080902305Activity.java delete mode 100644 students/soft1714080902305/app/src/main/1556119101(1).jpg delete mode 100644 students/soft1714080902305/app/src/main/AndroidManifest.xml delete mode 100644 students/soft1714080902305/app/src/main/Scan_Activity.java delete mode 100644 students/soft1714080902305/app/src/main/Soft1714080902305.java delete mode 100644 students/soft1714080902305/app/src/main/activity_scan_.xml delete mode 100644 students/soft1714080902305/thirdapp/src/main/AndroidManifest.xml delete mode 100644 students/soft1714080902305/thirdapp/src/main/java/edu/hzuapps/androidlabs/soft1714080902305/SecondActivity.java delete mode 100644 students/soft1714080902305/thirdapp/src/main/java/edu/hzuapps/androidlabs/soft1714080902305/Soft1714080902305.java delete mode 100644 students/soft1714080902305/thirdapp/src/main/res/drawable/cha.jpg delete mode 100644 students/soft1714080902305/thirdapp/src/main/res/layout/activity_second.xml delete mode 100644 students/soft1714080902305/thirdapp/src/main/res/layout/activity_soft1714080902305.xml delete mode 100644 students/soft1714080902305/thirdapp/src/main/res/values/strings.xml diff --git a/students/soft1714080902305/Soft1714080902305Activity.java b/students/soft1714080902305/Soft1714080902305Activity.java deleted file mode 100644 index ea71b8455..000000000 --- a/students/soft1714080902305/Soft1714080902305Activity.java +++ /dev/null @@ -1,5 +0,0 @@ -public class Soft1714080902305Activity{ -public static void main(String[]args){ - System.out.println("Hello world!"); - } -} \ No newline at end of file diff --git a/students/soft1714080902305/app/src/main/1556119101(1).jpg b/students/soft1714080902305/app/src/main/1556119101(1).jpg deleted file mode 100644 index beb8f4a9a79870ced96e3cd3b538aa7f56024fd7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41299 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 YKd$A}EG776mH+?%07*qoM6N<$f|iY5 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/students/soft1714080902305/app/src/main/Scan_Activity.java b/students/soft1714080902305/app/src/main/Scan_Activity.java deleted file mode 100644 index 8db427489..000000000 --- a/students/soft1714080902305/app/src/main/Scan_Activity.java +++ /dev/null @@ -1,192 +0,0 @@ -package edu.hzuapps.androidlabs.soft1714080902305; - -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.os.Bundle; -import android.os.Handler; -import android.os.Message; -import android.support.annotation.Nullable; -import android.support.v7.app.AppCompatActivity; -import android.util.Log; -import android.view.View; -import android.widget.Button; -import android.widget.ImageView; -import android.widget.Toast; - -import java.io.BufferedInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.lang.ref.WeakReference; -import java.net.HttpURLConnection; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.URLConnection; - -import edu.hzuapps.androidlabs.soft1714080902305.R; - -public class Scan_Activity extends AppCompatActivity implements View.OnClickListener{ - - public static final int DOWNLOAD_CODE = 10001; - public static final int DOWNLOAD_FAIL = 300; - public static final int CONNECT_TIMEOUT = 2000; - private ImageView image_download; - private Button btn_download; - - private Handler handler; - - private String path="\n" + "https://i.loli.net/2019/04/24/5cc078e683452.png"; - - private int fileLength; - - private Bitmap mBitmap; - - @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_scan_); - - //初始化控件 - initialView(); - - btn_download.setOnClickListener(this); - - //接收子线程的消息 - handler=new Handler(){ - @Override - public void handleMessage(Message msg) { - super.handleMessage(msg); - switch (msg.what){ - case DOWNLOAD_CODE: - /* - * 更新UI - * 提取消息中的bitmap,并设置ImageView - * */ - Bitmap bitmap=(Bitmap) msg.obj; - if (bitmap!=null){ - image_download.setImageBitmap(bitmap);//disPlay image - } - break; - case DOWNLOAD_FAIL: - Toast.makeText(Scan_Activity.this,"下载失败",Toast.LENGTH_SHORT).show(); - break; - } - } - }; - - } - - //初始化控件 - public void initialView(){ - btn_download=findViewById(R.id.btn_download); - image_download=findViewById(R.id.image_download); - } - - //按钮点击 - @Override - public void onClick(View view) { - switch (view.getId()){ - case R.id.btn_download: - //开启线程 - new Thread(new GetPictThread(handler,path)).start(); - break; - } - } - - - //自定义GetPictThread类实现Runnable类 - public class GetPictThread implements Runnable{ - //定义handler和path - public Handler handler; - public String path; - - //带参构造 - public GetPictThread(Handler handler, String path) { - this.handler = handler; - this.path = path; - } - - //在run方法中实现图片下载 - @Override - public void run() { - //通过Get方法请求获取网络图片 - try { - URL url=new URL(path); - HttpURLConnection connection=(HttpURLConnection) url.openConnection(); - - //设置请求方式 - connection.setRequestMethod("GET"); - //设置超时时间 - connection.setConnectTimeout(30*1000); - //发起连接 - connection.connect(); - - //获取状态码 - int requestCode=connection.getResponseCode(); - System.out.println(requestCode); - - if (requestCode==HttpURLConnection.HTTP_OK){ - /* - * 1.获得文件长度 - * 2.通过缓冲输入流 - * 3.将输入流转换成字节数组 - * 4.将字节数组转换成位图 - * */ - fileLength=connection.getContentLength(); - - InputStream is=new BufferedInputStream(connection.getInputStream()); - - //获取到字节数组 - byte[] arr=streamToArr(is); - - //将字节数组转换成位图 - mBitmap= BitmapFactory.decodeByteArray(arr,0,arr.length); - - /* - * 下载完成后将消息发送出去 - * 通知主线程,更新UI - * */ - Message message=Message.obtain(); - message.what=DOWNLOAD_CODE; - message.obj=mBitmap; - handler.sendMessage(message); - - }else { - Log.e("TAG", "run:error "+requestCode); - } - }catch (MalformedURLException e){ - e.printStackTrace(); - handler.sendEmptyMessage(DOWNLOAD_FAIL); - }catch (IOException e){ - e.printStackTrace(); - handler.sendEmptyMessage(DOWNLOAD_FAIL); - } - } - } - - //将输入流转换成字节数组 - public byte[] streamToArr(InputStream inputStream){ - - try { - ByteArrayOutputStream baos=new ByteArrayOutputStream(); - byte[] buffer=new byte[1024]; - int len; - - while ((len=inputStream.read(buffer))!=-1){ - baos.write(buffer,0,len); - } - - //关闭输出流 - baos.close(); - //关闭输入流 - inputStream.close(); - //返回字节数组 - return baos.toByteArray(); - }catch (IOException e){ - e.printStackTrace(); - //若失败,则返回空 - return null; - } - } - -} \ No newline at end of file diff --git a/students/soft1714080902305/app/src/main/Soft1714080902305.java b/students/soft1714080902305/app/src/main/Soft1714080902305.java deleted file mode 100644 index d4a1312bc..000000000 --- a/students/soft1714080902305/app/src/main/Soft1714080902305.java +++ /dev/null @@ -1,186 +0,0 @@ -package edu.hzuapps.androidlabs.soft1714080902305; - -import android.Manifest; -import android.content.DialogInterface; -import android.content.Intent; -import android.content.pm.PackageManager; -import android.net.Uri; -import android.os.Build; -import android.os.Bundle; -import android.provider.Settings; -import android.support.annotation.NonNull; -import android.support.design.widget.BottomNavigationView; -import android.support.v4.app.ActivityCompat; -import android.support.v4.content.ContextCompat; -import android.support.v7.app.AlertDialog; -import android.support.v7.app.AppCompatActivity; -import android.view.MenuItem; -import android.view.View; -import android.widget.TextView; -import android.widget.Toast; - -public class Soft1714080902305 extends AppCompatActivity { -// 要申请的权限 - private String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE}; - private AlertDialog dialog; - private TextView mTextMessage; - private TextView cxMessage; - private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener - = new BottomNavigationView.OnNavigationItemSelectedListener() { - - @Override - public boolean onNavigationItemSelected(@NonNull MenuItem item) { - switch (item.getItemId()) { - case R.id.navigation_home: - mTextMessage.setText(R.string.title_home); - return true; - case R.id.navigation_dashboard: - mTextMessage.setText(R.string.title_dashboard); - return true; - case R.id.navigation_notifications: - mTextMessage.setText(R.string.title_notifications); - return true; - } - return false; - } - }; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_soft1714080902305); - - mTextMessage = (TextView) findViewById(R.id.message); - cxMessage = (TextView) findViewById(R.id.textview_01); - cxMessage.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - Intent intent = new Intent(Soft1714080902305.this, ThirdActivity.class); - startActivity(intent); - } - - }); - - BottomNavigationView navigation = (BottomNavigationView) findViewById(R.id.navigation); - navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener); - - - - // 版本判断。当手机系统大于 23 时,才有必要去判断权限是否获取 - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - - // 检查该权限是否已经获取 - int i = ContextCompat.checkSelfPermission(this, permissions[0]); - // 权限是否已经 授权 GRANTED---授权 DINIED---拒绝 - if (i != PackageManager.PERMISSION_GRANTED) { - // 如果没有授予该权限,就去提示用户请求 - showDialogTipUserRequestPermission(); - } - } - } - - // 提示用户该请求权限的弹出框 - private void showDialogTipUserRequestPermission() { - - new AlertDialog.Builder(this) - .setTitle("存储权限不可用") - .setMessage("由于扫码支付需要获取存储空间,;\n否则,您将无法正常使用扫码支付") - .setPositiveButton("立即开启", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - startRequestPermission(); - } - }) - .setNegativeButton("取消", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - finish(); - } - }).setCancelable(false).show(); - } - - // 开始提交请求权限 - private void startRequestPermission() { - ActivityCompat.requestPermissions(this, permissions, 321); - } - - // 用户权限 申请 的回调方法 - @Override - public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { - super.onRequestPermissionsResult(requestCode, permissions, grantResults); - - if (requestCode == 321) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - if (grantResults[0] != PackageManager.PERMISSION_GRANTED) { - // 判断用户是否 点击了不再提醒。(检测该权限是否还可以申请) - boolean b = shouldShowRequestPermissionRationale(permissions[0]); - if (!b) { - // 用户还是想用我的 APP 的 - // 提示用户去应用设置界面手动开启权限 - showDialogTipUserGoToAppSettting(); - } else - finish(); - } else { - Toast.makeText(this, "权限获取成功", Toast.LENGTH_SHORT).show(); - } - } - } - } - - // 提示用户去应用设置界面手动开启权限 - - private void showDialogTipUserGoToAppSettting() { - - dialog = new AlertDialog.Builder(this) - .setTitle("存储权限不可用") - .setMessage("请在-应用设置-权限-中,允许扫码支付使用存储权限来保存用户数据") - .setPositiveButton("立即开启", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - // 跳转到应用设置界面 - goToAppSetting(); - } - }) - .setNegativeButton("取消", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - finish(); - } - }).setCancelable(false).show(); - } - - // 跳转到当前应用的设置界面 - private void goToAppSetting() { - Intent intent = new Intent(); - - intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); - Uri uri = Uri.fromParts("package", getPackageName(), null); - intent.setData(uri); - - startActivityForResult(intent, 123); - } - - // - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); - if (requestCode == 123) { - - if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - // 检查该权限是否已经获取 - int i = ContextCompat.checkSelfPermission(this, permissions[0]); - // 权限是否已经 授权 GRANTED---授权 DINIED---拒绝 - if (i != PackageManager.PERMISSION_GRANTED) { - // 提示用户应该去应用设置界面手动开启权限 - showDialogTipUserGoToAppSettting(); - } else { - if (dialog != null && dialog.isShowing()) { - dialog.dismiss(); - } - Toast.makeText(this, "权限获取成功", Toast.LENGTH_SHORT).show(); - } - } - } - } -} - diff --git a/students/soft1714080902305/app/src/main/activity_scan_.xml b/students/soft1714080902305/app/src/main/activity_scan_.xml deleted file mode 100644 index 0704a6c33..000000000 --- a/students/soft1714080902305/app/src/main/activity_scan_.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - -