[英]Unable to run app in emulator with API 29 android studio
我有一個應用程序在帶有 API 28 的模擬器中正常運行。但是當我在帶有 API 29 的模擬器中運行該應用程序時,它顯示
它不僅顯示在模擬器中不斷停止。 我嘗試在移動設備上安裝它,它也顯示相同的錯誤。
日志顯示這個錯誤是這樣的:
2020-02-14 19:48:12.922 20370-20370/? E/stickerappmake: Unknown bits set in runtime_flags: 0x8000
2020-02-14 19:48:15.326 20370-20454/com.testdev.appname E/eglCodecCommon: glUtilsParamSize: unknow param 0x000088ef
2020-02-14 19:48:15.326 20370-20454/com.testdev.appname E/eglCodecCommon: glUtilsParamSize: unknow param 0x000088ef
2020-02-14 19:48:15.385 20370-20454/com.testdev.appname E/eglCodecCommon: glUtilsParamSize: unknow param 0x000088ef
2020-02-14 19:48:15.385 20370-20454/com.testdev.appname E/eglCodecCommon: glUtilsParamSize: unknow param 0x000088ef
2020-02-14 19:48:17.138 20370-20454/com.testdev.appname E/eglCodecCommon: glUtilsParamSize: unknow param 0x000088ef
2020-02-14 19:48:17.139 20370-20454/com.testdev.appname E/eglCodecCommon: glUtilsParamSize: unknow param 0x000088ef
2020-02-14 19:48:17.243 20370-20454/com.testdev.appname E/eglCodecCommon: glUtilsParamSize: unknow param 0x000088ef
2020-02-14 19:48:17.243 20370-20454/com.testdev.appname E/eglCodecCommon: glUtilsParamSize: unknow param 0x000088ef
2020-02-14 19:48:19.984 20370-20464/com.testdev.appname E/eglCodecCommon: glUtilsParamSize: unknow param 0x000088ef
2020-02-14 19:48:19.984 20370-20464/com.testdev.appname E/eglCodecCommon: glUtilsParamSize: unknow param 0x000088ef
2020-02-14 19:48:20.048 20370-20454/com.testdev.appname E/eglCodecCommon: glUtilsParamSize: unknow param 0x000088ef
2020-02-14 19:48:20.048 20370-20454/com.testdev.appname E/eglCodecCommon: glUtilsParamSize: unknow param 0x000088ef
2020-02-14 19:48:20.059 20370-20454/com.testdev.appname E/eglCodecCommon: glUtilsParamSize: unknow param 0x000088ef
2020-02-14 19:48:20.063 20370-20454/com.testdev.appname E/eglCodecCommon: glUtilsParamSize: unknow param 0x000088ef
2020-02-14 19:48:22.727 20370-20370/com.testdev.appname E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.testdev.appname, PID: 20370
java.lang.NullPointerException: Attempt to get length of null array
at com.testdev.appname.activities.CreateFragment.loadStickersCreated(CreateFragment.java:52)
at com.testdev.appname.activities.CreateFragment.onCreateView(CreateFragment.java:88)
at android.support.v4.app.Fragment.performCreateView(Fragment.java:2439)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1460)
at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1784)
at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:797)
at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2625)
at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2411)
at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2366)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2273)
at android.support.v4.app.FragmentManagerImpl.dispatchStateChange(FragmentManager.java:3273)
at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:3229)
at android.support.v4.app.FragmentController.dispatchActivityCreated(FragmentController.java:201)
at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:620)
at android.support.v7.app.AppCompatActivity.onStart(AppCompatActivity.java:178)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1425)
at android.app.Activity.performStart(Activity.java:7825)
at android.app.ActivityThread.handleStartActivity(ActivityThread.java:3294)
at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:221)
at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:201)
at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:173)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
我看到 CreateFragment.java 中的 java 代碼存在一些問題。 Java 代碼如下: CreateFragment.java 代碼:
包 com.devname.appname.activity;
import android.app.Activity;
import android.app.AlertDialog;
import android.support.v4.app.Fragment;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.support.annotation.NonNull;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.PopupMenu;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import com.facebook.drawee.view.SimpleDraweeView;
import com.devname.appname.helpers.Admob;
import com.sangcomz.fishbun.FishBun;
import com.sangcomz.fishbun.adapter.image.impl.GlideAdapter;
import com.sangcomz.fishbun.define.Define;
import com.devname.appname.R;
import com.devname.appname.backgroundRemover.CutOut;
import com.devname.appname.helpers.Constants;
import com.devname.appname.utils.FileUtils;
import com.devname.appname.utils.StickerPacksManager;
import java.io.File;
import java.util.ArrayList;
public class CreateFragment extends Fragment {
ImagesGridAdapter imagesGridAdapter;
View view;
public CreateFragment() {
// Required empty public constructor
}
public static ArrayList<Uri> loadStickersCreated() {
String directoryPath = Constants.STICKERS_CREATED_DIRECTORY_PATH;
File directory = new File(directoryPath);
ArrayList<Uri> images = new ArrayList<>();
if (directory.exists()) {
File[] stickersImages = directory.listFiles();
for (File f : stickersImages) {
if (f.isFile() && (f.getName().contains(".png") || f.getName().contains(".PNG"))) {
images.add(Uri.fromFile((f)));
}
}
} else {
directory.mkdir();
}
// verifyStickersCount();
return images;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
view = inflater.inflate(R.layout.fragment_create, container, false);
Admob.createLoadBanner(getContext(), view);
view.findViewById(R.id.create_sticker).setOnClickListener(v -> FishBun.with(getActivity())
.setImageAdapter(new GlideAdapter())
.setMaxCount(1)
.exceptGif(true)
.setMinCount(1)
.setActionBarColor(getResources().getColor(R.color.colorPrimaryDark), getResources().getColor(R.color.colorPrimary), false)
.setActionBarTitleColor(Color.parseColor("#ffffff"))
.startAlbum());
RecyclerView gridview = view.findViewById(R.id.stickers_created_grid);
GridLayoutManager gridLayoutManager = new GridLayoutManager(view.getContext(), 3);
gridview.setLayoutManager(gridLayoutManager);
imagesGridAdapter = new ImagesGridAdapter(view.getContext(), loadStickersCreated());
gridview.setAdapter(imagesGridAdapter);
verifyStickersCount();
return view;
}
public void verifyStickersCount() {
View linearLayout = view.findViewById(R.id.no_stickers_icon);
if (imagesGridAdapter == null || imagesGridAdapter.getItemCount() == 0) {
linearLayout.setVisibility(View.VISIBLE);
} else {
linearLayout.setVisibility(View.GONE);
}
}
public static void addImageToGallery(final String filePath, final Context context) {
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.DATE_TAKEN, System.currentTimeMillis());
values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
values.put(MediaStore.MediaColumns.DATA, filePath);
context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.d("TESTTTTTT",requestCode+"");
if (requestCode == CutOut.CUTOUT_ACTIVITY_REQUEST_CODE) {
Log.d("TESTTTTTT :::::",requestCode+"");
switch (resultCode) {
case Activity.RESULT_OK:
String imagePath_intent = data.getStringExtra("imagePath");
Uri imageUri = Uri.fromFile(new File(imagePath_intent));
Log.d("TESTTTTTT ::::: He",imageUri+"");
String stickerName = FileUtils.generateRandomIdentifier();
Uri imagePath = Uri.parse(Constants.STICKERS_CREATED_DIRECTORY_PATH + stickerName + ".PNG");
StickerPacksManager.createStickerImageFile(imageUri, imagePath, getActivity(), Bitmap.CompressFormat.PNG);
addImageToGallery(imagePath.getPath(), getActivity());
imagesGridAdapter.uries = loadStickersCreated();
imagesGridAdapter.notifyDataSetChanged();
Toast.makeText(getActivity(), "Sticker created", Toast.LENGTH_LONG).show();
verifyStickersCount();
break;
case CutOut.CUTOUT_ACTIVITY_RESULT_ERROR_CODE:
Exception ex = CutOut.getError(data);
Log.d("TESTTTTTT :::::",ex+"::DDD");
break;
default:
System.out.print("User cancelled the CutOut screen");
}
} else if (requestCode == Define.ALBUM_REQUEST_CODE) {
ArrayList<Uri> uries;
if (resultCode == Activity.RESULT_OK) {
uries = data.getParcelableArrayListExtra(Define.INTENT_PATH);
CutOut.activity().src(uries.get(0)).intro().start(getActivity());
}
}
}
public class ImagesGridAdapter extends RecyclerView.Adapter<ImageViewHolder> {
public ArrayList<Uri> uries = new ArrayList<>();
Context context;
public ImagesGridAdapter(Context context, ArrayList<Uri> uries) {
this.uries = uries;
this.context = context;
}
@NonNull
@Override
public ImageViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
final Context context = viewGroup.getContext();
final LayoutInflater layoutInflater = LayoutInflater.from(context);
final View view = layoutInflater.inflate(R.layout.sticker_created_item, viewGroup, false);
return new ImageViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ImageViewHolder imageAdapter, int index) {
imageAdapter.imageView.setImageURI(uries.get(index));
imageAdapter.imageView.setPadding(8, 8, 8, 8);
imageAdapter.imageView.setOnLongClickListener(v -> {
PopupMenu popupMenu = new PopupMenu(context, imageAdapter.imageView);
popupMenu.inflate(R.menu.sticker_menu);
popupMenu.setOnMenuItemClickListener(item -> {
switch (item.getItemId()) {
/* case R.id.add_to_exist_stickerpack:
addToStickerPack(index);
break;*/
case R.id.delete_sticker:
this.deleteSticker(index);
break;
default:
break;
}
return false;
});
popupMenu.show();
return false;
});
}
void deleteSticker(int index) {
new AlertDialog.Builder(context)
.setTitle("Deleting")
.setMessage("Are you sure you want to delete this sticker?")
.setPositiveButton("Yes", (dialog, which) -> {
Uri uri = uries.get(index);
FileUtils.deleteFile(uri.getPath(),context);
uries.remove(index);
notifyItemRemoved(index);
notifyDataSetChanged();
Toast.makeText(context, "Deleted", Toast.LENGTH_SHORT).show();
verifyStickersCount();
})
.setNegativeButton("No", null)
.show();
}
void addToStickerPack(int index) {
Intent intent = new Intent(context, AddToStickerPackActivity.class);
intent.setData(uries.get(index));
startActivity(intent);
}
@Override
public int getItemCount() {
return uries.size();
}
}
class ImageViewHolder extends RecyclerView.ViewHolder {
SimpleDraweeView imageView;
public ImageViewHolder(@NonNull View itemView) {
super(itemView);
this.imageView = itemView.findViewById(R.id.sticker_created_image);
}
}
}
讓我們閱讀您的錯誤消息:
java.lang.NullPointerException:嘗試獲取空數組的長度
你的一些數組是null
,你仍然試圖得到它的length
。
在 com.testdev.appname.activities.CreateFragment.loadStickersCreated(CreateFragment.java:52)
它甚至會告訴你,你會在哪一行找到錯誤
File[] stickersImages = directory.listFiles();
貼紙圖像似乎為空。
for (File f : stickersImages) {/*...*/}
它嘗試從stickerImages
讀取,它為null
,因此拋出此Exception
。
根據您的評論,這些是清單中的應用權限:
<uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
您需要添加讀取權限才能從目錄中獲取文件,因此將以下權限應用於您的清單:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
您也應該在運行時檢查此權限,因為用戶可能會拒絕它並且此錯誤將再次顯示,您可以進行如下檢查:
public boolean readExtertalStoragePermission() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
int result = context.checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE);
return result == PackageManager.PERMISSION_GRANTED;
}
return false;
}
有關更多詳細信息,您可以 在此處查看
問題出在 Constants.STICKERS_CREATED_DIRECTORY_PATH 中的目錄路徑中。 在 Constant.java 中有一些代碼如下:
public final static String STICKERS_CREATED_DIRECTORY_PATH = Environment.getExternalStorageDirectory() + "/WA Stickers/My Created/";
然后我指定目錄路徑
public final static String STICKERS_CREATED_DIRECTORY_PATH = Environment.getExternalStorageDirectory() + "/storage/emulated/0/WA Stickers/My Created/";
有用。 感謝您的回答。
編輯:它僅適用於模擬器。 我嘗試在真實設備上安裝,但應用程序強制關閉。
編輯:問題已解決。 我安裝了與之前已經安裝的 apk 不同的 apk 簽名者的 apk。 所以一切正常運行上面的代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.