【发布时间】:2023-03-23 14:12:01
【问题描述】:
我正在尝试将我的活动转换为片段,但我遇到了一些错误,有人可以指出我哪里出了问题以及如何解决它 我将向您展示发生错误的代码,但首先是错误
首先getApplicationContext getContentResolver 和RESULT_OK 收到“无法解析方法”错误
其次,UploadFrag.this 得到错误的参数错误
片段是您选择图像并将其上传到我的工作服务器的活动
package com.smartpractice.myapplication;
import android.annotation.SuppressLint;
import android.app.ProgressDialog;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.provider.MediaStore;
import android.provider.OpenableColumns;
import android.util.Base64;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import androidx.fragment.app.Fragment;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Objects;
public class UploadFrag extends Fragment implements View.OnClickListener {
public static final String UPLOAD_URL = "https://www.smsjsjjsjs.co.za/files-upload-ruben.asp?MyForm=Yes";
public static final String UPLOAD_KEY = "image";
private int PICK_IMAGE_REQUEST = 1;
private Button buttonChoose;
private Button buttonUpload;
private ImageView imageView;
private Bitmap bitmap;
private Uri filePath;
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
return inflater.inflate(R.layout.activity_upload, container, false);
}
@Override
public void onStart() {
super.onStart();
init();
}
private void init(){
buttonChoose = getView().findViewById(R.id.btnChoose);
buttonUpload = getView().findViewById(R.id.btnUpload);
imageView = getView().findViewById(R.id.imageView);
buttonChoose.setOnClickListener(this);
buttonUpload.setOnClickListener(this);
}
private void showFileChooser() {
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE_REQUEST);
}
错误无法解析 RESULT_OK 上的符号 并且无法解析 getContentResolver 上的方法
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == PICK_IMAGE_REQUEST && resultCode ==* RESULT_OK* && data != null && data.getData() != null) {
filePath = data.getData();
try {
bitmap = MediaStore.Images.Media.getBitmap(*getContentResolver()*, filePath);
imageView.setImageBitmap(bitmap);
} catch (IOException e) {
e.printStackTrace();
}
}
}
public String getStringImage(Bitmap bmp){
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] imageBytes = baos.toByteArray();
return Base64.encodeToString(imageBytes, Base64.DEFAULT);
}
private void uploadImage(){
@SuppressLint("StaticFieldLeak")
class UploadImage extends AsyncTask<Bitmap,Void,String> {
private ProgressDialog loading;
private RequestHandler rh = new RequestHandler();
error UploadFrag.this 得到第一个错误的参数类型
@Override
protected void onPreExecute() {
super.onPreExecute();
loading = ProgressDialog.show(*UploadFrag.this,* "Uploading Image", "Please wait...",true,true);
}
错误 getApplicationContext 无法解析方法
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
loading.dismiss();
Toast.makeText(*getApplicationContext()*,s,Toast.LENGTH_LONG).show();
}
@RequiresApi(api=Build.VERSION_CODES.KITKAT)
@Override
protected String doInBackground(Bitmap... params) {
Bitmap bitmap = params[0];
String uploadImage = getStringImage(bitmap);
HashMap<String,String> data = new HashMap<>();
data.put(UPLOAD_KEY, uploadImage);
data.put("name",getFileName(filePath));
return rh.postRequest(UPLOAD_URL,data);
}
}
UploadImage ui = new UploadImage();
ui.execute(bitmap);
}
error UploadFrag.this 获得第二个错误的参数类型,无法解析 makeText 上的方法
@Override
public void onClick(View v) {
if (v == buttonChoose) {
showFileChooser();
}
if(v == buttonUpload){
if(filePath!=null) {
uploadImage();
} else {
*Toast.makeText(UploadFrag.this,"Select Image",Toast.LENGTH_LONG).show();*
}
}
}
错误无法解析 getContentResolver 上的方法
@RequiresApi(api=Build.VERSION_CODES.KITKAT)
String getFileName(Uri uri){
String result = null;
if (Objects.equals(uri.getScheme(), "content")) {
try (Cursor cursor=*getContentResolver()*.query(uri, null, null, null, null)) {
if (cursor != null && cursor.moveToFirst()) {
result=cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME));
}
}
}
if (result == null) {
result = uri.getPath();
assert result != null;
int cut = result.lastIndexOf('/');
if (cut != -1) {
result = result.substring(cut + 1);
}
}
return result;
}
}
【问题讨论】:
-
在片段中作为上下文使用 getActivity()
-
一个问题中的问题太多。一般来说,activity有一些fragment没有的方法(例如
getApplicationContext)。例如,请改用getActivity.getApplicationContext()。与getContentResolver相同。同样至于this参数是因为您尝试使用它的方法不仅需要任何this,还需要某种特定类型的对象,片段不是,但Activity 是。 -
@Piyush 谢谢,好像成功了
标签: android android-studio android-activity fragment