我的Android应用无法在Android 7

时间:2017-08-06 10:28:12

标签: android uri android-7.0-nougat

我开发了一个摄像头android应用程序,它工作正常但是当我在android 7中运行它时,它会创建一条消息,说明"该应用程序已停止"!我认为问题来自我的代码文件,它是我的图库文件:

public class Gallery extends Activity {

GridView gv;
ArrayList<File> list;
Context context;
private static VirtualFileSystem vfs;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_gallery2);


    File f = new File("/myfiles.db");

    list = imageReader(f);

    gv = (GridView) findViewById(R.id.gridview);
    gv.setAdapter(new GridAdapter());

    gv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            startActivity(new Intent(getApplicationContext(), viewImage.class).putExtra("img", list.get(position).toString()));
        }
    });
}


class GridAdapter extends BaseAdapter {
    public ImageView iv;
    public Bitmap bmp = null;
    public File file ;
    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int position) {
        return list.get(position);
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }


    class ViewHolder {

        ImageView icon;

    }


    @Override
    public View getView(final int position,  View convertView, ViewGroup parent) {
        Log.e("sara" , "this part takes time");


        LayoutInflater inflater = getLayoutInflater();
        getLayoutInflater().inflate(R.layout.gallery_gridsq, parent, false);

        convertView = getLayoutInflater().inflate(R.layout.gallery_gridsq, parent, false);
        iv = (ImageView) convertView.findViewById(R.id.icon);
        file = new File(Uri.parse(getItem(position).toString()).getPath());
        new myTask(iv, file).execute();

        return convertView;
    }


    private class myTask extends AsyncTask <Void , Void ,Bitmap> {
        ImageView iv;
        File file;

        public myTask(ImageView iv, File file) {
            this.iv=iv;
            this.file= file;
        }



        @Override
        protected Bitmap doInBackground(Void... params) {

            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inJustDecodeBounds = true;
            try {
                BitmapFactory.decodeStream(new FileInputStream(file), null, options);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }

            options.inJustDecodeBounds = false;
            options.inSampleSize = 2;
            try {
                bmp = BitmapFactory.decodeStream(new FileInputStream(file), null, options);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
            return bmp;
        }


        @Override
        protected void onPostExecute(Bitmap aVoid) {

            iv.setImageBitmap(aVoid);
        }
    }
}


ArrayList<File> imageReader ( File root) {

    final ArrayList<File> a = new ArrayList<>();

    File[] files = root.listFiles();


    for (int i = files.length - 1; i >= 0; i--) {


        if (files[i].isDirectory()) {
            // input name directory to array list
            a.addAll(imageReader(files[i]));
        } else {
            if (files[i].getName().endsWith(".jpg")) {
                a.add(files[i]);
            }
        }
    }
    return a;
}

在该链接中,它使用&#34; getUriForFile&#34;但我认为在这种情况下它无法帮助我! 这是我的logcat:

  

08-07 02:10:21.757 2343-2343 /? E / memtrack:无法加载memtrack   模块(没有这样的文件或目录)08-07 02:10:21.757 2343-2343 /?   E / android.os.Debug:无法加载memtrack模块:-2 08-07   02:10:21.913 2349-2349 /? E / memtrack:无法加载memtrack模块(No   这样的文件或目录)08-07 02:10:21.913 2349-2349 /?   E / android.os.Debug:无法加载memtrack模块:-2 08-07   02:10:22.220 2370-2370 /? E / cutils-trace:打开跟踪文件时出错:   许可被拒绝(13)08-07 02:10:23.334 2390-2390 /? E / memtrack:   无法加载memtrack模块(没有这样的文件或目录)08-07   02:10:23.334 2390-2390 /? E / android.os.Debug:无法加载memtrack   模块:-2 08-07 02:10:23.708 2399-2415 /? E / libEGL:   load_driver(/system/lib/egl/libGLES_emulation.so):dlopen失败:   library&#34; /system/lib/egl/libGLES_emulation.so"找不到08-07   02:10:23.802 2399-2399 /? E / AndroidRuntime:致命异常:主要                                                    过程:com.example.zeinab.amndoorbin,PID:2399                                                    java.lang.NullPointerException:使用null调用cancel()   的PendingIntent                                                        在android.app.AlarmManager.cancel(AlarmManager.java:890)                                                        在info.guardianproject.cacheword.CacheWordService.resetTimeout(CacheWordService.java:189)                                                        在info.guardianproject.cacheword.CacheWordService.attachSubscriber(CacheWordService.java:145)                                                        在info.guardianproject.cacheword.CacheWordHandler $ 2.onServiceConnected(CacheWordHandler.java:457)                                                        在android.app.LoadedApk $ ServiceDispatcher.doConnected(LoadedApk.java:1453)                                                        在android.app.LoadedApk $ ServiceDispatcher $ RunConnection.run(LoadedApk.java:1481)                                                        在android.os.Handler.handleCallback(Handler.java:751)                                                        在android.os.Handler.dispatchMessage(Handler.java:95)                                                        在android.os.Looper.loop(Looper.java:154)                                                        在android.app.ActivityThread.main(ActivityThread.java:6119)                                                        at java.lang.reflect.Method.invoke(Native Method)                                                        在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:886)                                                        在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)08-07   02:10:25.520 2399-2415 /? E / EGL_emulation:tid 2415:   eglSurfaceAttrib(1174):错误0x3009(EGL_BAD_MATCH)08-07   02:10:25.612 706-1732 /? E / EGL_emulation:tid 1732:   eglSurfaceAttrib(1174):错误0x3009(EGL_BAD_MATCH)

2 个答案:

答案 0 :(得分:1)

我认为您应该更改应用配置。将项目结构中的目标api更改为api 25。参考此链接

寻求帮助

答案 1 :(得分:0)

在Android M(api-23)之后,您应该要求用户接受所需的权限。你可以通过打开一个对话框来完成这个。这是示例代码:

ActivityCompat.requestPermissions(yourActivity.this,
                new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                1);

您可以通过以下代码获取权限请求的结果:

@Override
public void onRequestPermissionsResult(int requestCode,
                                       String permissions[], int[] grantResults){
   switch (requestCode) {
       case 1: {

        // If request is cancelled, the result arrays are empty.
        if (grantResults.length > 0
                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

            // permission was granted, 
            // contacts-related task you need to do.          
         } else {

            // permission denied
            // functionality that depends on this permission.
            Toast.makeText(yourActivity.this, "Permission denied to read your External storage", Toast.LENGTH_SHORT).show();
        }
        return;
    }

    // other 'case' lines to check for other
    // permissions this app might request
  }
}